Sdílet prostřednictvím


Upozornění kompilátoru (úroveň 2) C4150

odstranění ukazatele na neúplný typ "typ"; není volána žádná destruktor

Operátor delete je volána k odstranění typu, který byl deklarován, ale není definován. Kompilátor nemůže najít destruktor pro volání, protože definice není ve stejné jednotce překladu deletejako .

Příklad

Následující ukázka generuje C4150 deklarováním, ale nedefinováním class IncClass:

// compile with: /W2
class IncClass;

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

Pokud chcete tento problém vyřešit, vložte definici IncClass do stejného souboru jako delete. Pokud je třída deklarována v souboru hlavičky, lze jej přidat do souboru pomocí #include. Pokud třída není deklarována v souboru hlavičky, NoDestruct může být nutné definici funkce přesunout do stejného souboru jako IncClass definice.

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

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

C4150 se vygeneruje, když je třída definována po volání destruktoru ve stejném souboru. V následujícím příkladu IncClass je deklarován před použití, ale definován za delete:

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

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

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

V tomto scénáři musí být použití delete za definicí třídy.

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

void NoDestruct( IncClass* pIncClass );

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

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

Viz také