Compartir vía


Advertencia del compilador (nivel 2) C4150

eliminación de puntero a tipo "type" incompleto; no se llamó a ningún destructor

Se llama al operador delete para eliminar un tipo declarado pero no definido. El compilador no encuentra el destructor al que llamar porque la definición no está en la misma unidad de traducción que la delete.

Ejemplo

La muestra siguiente genera la advertencia C4150 declarando pero no definiendo class IncClass:

// compile with: /W2
class IncClass;

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

Para corregir el incidencia, coloque la definición de IncClass en el mismo archivo que el delete. Si la clase se declara en un archivo de encabezado, se puede agregar al archivo mediante #include. Si la clase no se declara en un archivo de encabezado, es posible que la definición de función NoDestruct deba moverse al mismo archivo que la definición de IncClass.

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

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

C4150 se emitirá cuando se defina la clase después de la llamada del destructor en el mismo archivo. En el ejemplo siguiente IncClass se declara antes de usarse, pero se define después del delete:

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

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

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

En este escenario, el uso de delete debe ser después de la definición de clase.

// 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 también