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 delete
jako .
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;
}