Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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;
}