Condividi tramite


Avviso del compilatore (livello 2) C4150

eliminazione del puntatore al tipo incompleto 'type'; nessun distruttore chiamato

L'operatore delete viene chiamato per eliminare un tipo dichiarato ma non definito. Il compilatore non riesce a trovare il distruttore da chiamare perché la definizione non si trova nella stessa unità di conversione di delete.

Esempio

L'esempio seguente genera l'errore C4150 dichiarando ma non definendo class IncClass:

// compile with: /W2
class IncClass;

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

Per risolvere il problema, inserire la definizione di IncClass nello stesso file di delete. Se la classe viene dichiarata in un file di intestazione, può essere aggiunta al file usando #include. Se la classe non è dichiarata in un file di intestazione, potrebbe essere necessario spostare la definizione della NoDestruct funzione nello stesso file della IncClass definizione.

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

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

C4150 verrà generato quando la classe viene definita dopo la chiamata del distruttore nello stesso file. Nell'esempio IncClass seguente viene dichiarato prima di essere usato, ma definito dopo :delete

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

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

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

In questo scenario, l'uso di deve essere dopo la definizione della delete 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;
}

Vedi anche