Aviso do compilador (nível 2) C4150
exclusão do ponteiro para o tipo incompleto "type"; nenhum destruidor chamado
O operador delete
é chamado para excluir um tipo que foi declarado, mas não definido. O compilador não consegue localizar o destruidor a ser chamado porque a definição não está na mesma unidade de tradução que a delete
.
Exemplo
O exemplo a seguir gera C4150 declarando, mas não definindo class IncClass
:
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass; // C4150
}
Para corrigir o problema, coloque a definição de IncClass
no mesmo arquivo que o delete
. Se a classe for declarada em um arquivo de cabeçalho, ela poderá ser adicionada ao arquivo usando #include
. Se a classe não for declarada em um arquivo de cabeçalho, a definição da função NoDestruct
poderá precisar ser movida para o mesmo arquivo que a definição de IncClass
.
// compile with: /W2
#include "IncClass.h"
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass;
}
C4150 será emitido quando a classe for definida após a chamada do destruidor no mesmo arquivo. No exemplo a seguir, IncClass
é declarado antes de ser usado, mas definido após o delete
:
// C4150.cpp
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass; // C4150
}
class IncClass
{
public:
IncClass() = default;
~IncClass() = default;
};
Nesse cenário, o uso de delete
precisa ser após a definição de classe.
// C4150.cpp
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass );
class IncClass
{
public:
IncClass() = default;
~IncClass() = default;
};
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass;
}