클래스를 책의 내용대로 작성하고 거기에서 추가로 소멸자에서 메모리를 자동해제 할 수 있게 작성해봤습니다.
Code: Select all
//단일체
class JSingleton
{
public:
static JSingleton* Instance(void)
{
if(_instance == NULL)
{
FILE* fp = fopen("싱글톤 생성.txt", "w");
fclose(fp);
_instance = new JSingleton;
}
return _instance;
}
~JSingleton()
{
if(_instance != NULL)
{
FILE* fp = fopen("싱글톤 해제.txt", "w");
fclose(fp);
delete _instance;
}
}
void Test(void)
{
printf("싱글톤 테스트\n", _instance, this);
}
protected:
JSingleton() {}
private:
static JSingleton* _instance; // (== this)
};
JSingleton* JSingleton::_instance = NULL;
int _tmain(int argc, _TCHAR* argv[])
{
// using std::auto_ptr;
// auto_ptr<JSingleton> ps = JSingleton::Instance(); //정상적으로 해제 됨
JSingleton* ps = JSingleton::Instance(); //소멸자 호출 안 됨
ps->Test();
return 0;
}
그런데 소멸자가 호출이 되지 않네요.
JSingleton* ps을 로컬(메인 함수 내에서)로 선언하였으니 당연히 메인 함수가 끝날 때 소멸자가 실행이
될 것으로 예상했지만 안되더군요.
JSingleton::_instance 멤버가 static으로 되어있어서 그런 걸까요?
그래서 메인 함수의 끝나는 지점에
Code: Select all
delete ps;
제가 의도한 것은 종료직전에 외부적인 호출 없이도 객체내에서 스스로 메모리가 해제되고
delete가 한번만 실행되는 겁니다.
auto_ptr을 사용하지 않고도 말이죠.
어떤 방법이 있을까요.