다음을 통해 공유


컴파일러 경고(수준 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;
}

참고 항목