c++ 에서 클래스를 동적으로 생성/소멸해서 쓰는 때가 많은데 delete 로 객체를 메모리에서 해제 시켜도 해당 객체의 소멸자가 호출되지않는 귀신이 곡할때가 있다.
바로 아래의 경우에 해당한다.
< MyClass.h 파일 >
class MyClass {
public:
MyClass();
~MyClass();
};
< MyClass.cpp 파일 >
MyClass::MyClass()
{
printf("contructor\n");
}
MyClass::~MyClass()
{
printf("destructor\n");
}
< MainClass.h 파일 >
class MyClass;
class MainClass {
...
MyClass *myClass;
void free();
};
< MainClass.cpp 파일 >
#include "MainClass.h"
MainClass::MainClass()
{
myClass = new MyClass();
}
...
void MainClass::free()
{
delete myClass; => myClass 객체변수는 분명히 메모리해제되지만 MyClass::~MyClass() 소멸자 함수는 호출되지않는다
}
위와 같은 상황은 MainClass 쪽에서 MyClass 헤더파일을 include 해주지않고
MainClass.h 에 class MyClass; 와 같이 선언만 해주었기때문에 발생한다.
MainClass 에서 myClass 인스턴스의 어떤 변수/함수 필드도 엑세스하지않기때문에
컴파일 에러도 발생하지않으며 delete 시 메모리에서도 정상해제된다. 단지 소멸자 함수만
호출되지않는다.
이런 경우 반드시 MyClass.h 파일을 include 해주어야한다.
< MainClass.cpp >
#include "MyClass.h" <= !!!
댓글 없음:
댓글 쓰기