컴파일러 경고(수준 2) C4150
불완전한 형식 'type'에 대한 포인터를 삭제했습니다. 소멸자가 호출되지 않습니다.
선언되었지만 정의되지 않은 형식을 삭제하기 위해 delete
연산자가 호출됩니다. 정의가 delete
와 동일한 변환 단위에 있지 않기 때문에 컴파일러가 호출할 소멸자를 찾을 수 없습니다.
예시
다음 샘플은 class IncClass
를 선언하지만 정의하지 않음으로써 C4150을 생성합니다.
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass; // C4150
}
문제를 해결하려면 IncClass
정의를 delete
와 동일한 파일에 넣으세요. 클래스가 헤더 파일에 선언된 경우 #include
를 사용하여 파일에 추가할 수 있습니다. 클래스가 헤더 파일에 선언되지 않은 경우 NoDestruct
함수 정의를 IncClass
정의와 동일한 파일로 이동해야 할 수도 있습니다.
// compile with: /W2
#include "IncClass.h"
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass;
}
C4150은 동일한 파일에서 소멸자 호출 후에 클래스가 정의되면 내보내집니다. 다음 예에서 IncClass
는 사용되기 전에 선언되었지만 delete
뒤에 정의되었습니다.
// C4150.cpp
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass; // C4150
}
class IncClass
{
public:
IncClass() = default;
~IncClass() = default;
};
이 시나리오에서는 클래스 정의 뒤에 delete
를 사용해야 합니다.
// C4150.cpp
// compile with: /W2
class IncClass;
void NoDestruct( IncClass* pIncClass );
class IncClass
{
public:
IncClass() = default;
~IncClass() = default;
};
void NoDestruct( IncClass* pIncClass )
{
delete pIncClass;
}