编译器警告(等级 2)C4150

删除指向不完整“type”类型的指针;没有调用析构函数

调用 delete 运算符来删除某个已声明过但尚未定义的类型。 编译器找不到要调用的析构函数,因为定义与 delete 不在同一个翻译单元中。

示例

以下示例通过声明但不定义 class IncClass 来生成 C4150:

// compile with: /W2
class IncClass;

void NoDestruct( IncClass* pIncClass )
{
   delete pIncClass; // C4150
}

若要解决此问题,请将 IncClass 的定义放在与 delete 相同的文件中。 如果在头文件中声明类,则可以使用 #include 将其添加到文件中。 如果未在头文件中声明类,则 NoDestruct 函数定义可能需要移动到与 IncClass 定义相同的文件中。

// compile with: /W2
#include "IncClass.h"

void NoDestruct( IncClass* pIncClass )
{
   delete pIncClass;
}

如果在同一文件中调用析构函数后定义类,将发出 C4150。 在以下示例中,IncClass 是在使用之前声明的,但是在 delete 后定义的:

// C4150.cpp
// compile with: /W2
class IncClass;

void NoDestruct( IncClass* pIncClass )
{
   delete pIncClass; // C4150
}

class IncClass
{
public:
    IncClass() = default;
    ~IncClass() = default;
};

在此方案中,要在使用 delete 之前定义类。

// C4150.cpp
// compile with: /W2
class  IncClass;

void NoDestruct( IncClass* pIncClass );

class IncClass
{
public:
    IncClass() = default;
    ~IncClass() = default;
};

void NoDestruct( IncClass* pIncClass )
{
   delete pIncClass;
}

另请参阅