Compartilhar via


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;
}

Confira também