編譯器警告 (層級 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;
}