共用方式為


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

另請參閱