Partilhar via


Aviso do compilador (nível 2) C4150

eliminação do ponteiro para o tipo incompleto «tipo»; nenhum destrutor foi chamado

Observações

O delete operador é chamado para excluir um tipo que foi declarado, mas não definido. O compilador não consegue encontrar o destrutor para chamar porque a definição não está na mesma unidade de tradução que o delete.

Example

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 ficheiro 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 NoDestruct definição de função pode precisar ser movida para o mesmo arquivo que a IncClass definição.

// 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 IncClass a seguir é 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;
};

Neste cenário, o uso de delete precisa acontecer após a definição da 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;
}

Consulte também