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