Udostępnij za pośrednictwem


Ostrzeżenie kompilatora (poziom 2) C4150

usunięcie wskaźnika do niekompletnego typu "type"; brak destruktora o nazwie

Operator delete jest wywoływany w celu usunięcia typu, który został zadeklarowany, ale nie został zdefiniowany. Kompilator nie może odnaleźć destruktora do wywołania, ponieważ definicja nie znajduje się w tej samej jednostce tłumaczenia co element delete.

Przykład

Poniższy przykład generuje C4150, deklarując, ale nie definiując elementu class IncClass:

// compile with: /W2
class IncClass;

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

Aby rozwiązać ten problem, umieść definicję IncClass w tym samym pliku co .delete Jeśli klasa jest zadeklarowana w pliku nagłówkowym, można ją dodać do pliku przy użyciu polecenia #include. Jeśli klasa nie jest zadeklarowana w pliku nagłówkowym, NoDestruct może być konieczne przeniesienie definicji funkcji do tego samego pliku co IncClass definicja.

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

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

C4150 będzie emitowany, gdy klasa jest zdefiniowana po wywołaniu destruktora w tym samym pliku. W poniższym przykładzie IncClass jest zadeklarowany przed rozpoczęciem użycia, ale zdefiniowany po pliku delete:

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

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

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

W tym scenariuszu delete użycie musi być po definicji klasy.

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

void NoDestruct( IncClass* pIncClass );

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

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

Zobacz też