编译器警告(等级 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;
}