디자인패턴-싱글턴패턴 ( C++로구현 )


[출처] 미쉘린의 낭만코딩..

[원문] http://thx4alice.tistory.com/303

 
싱글톤 패턴:
어떠한 객체의 개수를 유한한 개수로 제한하는 것이다!
보통은 하나를 만들기위해 많이 쓴다. 

->클래스 인스턴스가 하나만 만들어지도록 하고, 그 인스턴스에 대한 전역 접근을 제공합니다.
 

 
  1. #include <iostream>   
  2.   
  3. using namespace std;   
  4.   
  5. class Singleton   
  6. {   
  7. private:   
  8.     Singleton() { };   
  9.     ~Singleton() { };   
  10.   
  11. public:   
  12.     static Singleton* getInstance()   
  13.     {   
  14.         static Singleton *uniqueInstance = NULL;   
  15.   
  16.         if( uniqueInstance == NULL )   
  17.             uniqueInstance = new Singleton();   
     
  18.         return uniqueInstance;   
  19.     }   
  20. };   
  21.   
  22. void main()   
  23. {   
  24.     Singleton *singleton = Singleton::getInstance();   //실제사용부분
  25. }  
     

이 코드도 문제없어 보이지만, 소멸자 호출이 불가능합니다.

어차피 싱글톤 패턴 자체가 객체를 하나만 생성하기 때문에, 문제가 있겠느냐 싶지만은...엄청난 문제가 따른다
싱글턴 객체가 포인터로 static 정적데이터 영역에 들어간다.
그리고 실제 메모리는 동적 할당으로 힙메모리에 할당이 될것이다.
그렇기때문에 모든 객체가 메모리를 공유할순있겠지만 객체 사용이 끝나도 소멸자 호출로 인해 메모리 해제가 되지 않을 것이다.

소멸자 호출이 안되는 것은 심각한 문제일 수도 있기 때문에...

 

 
  1. #include <iostream>   
  2.   
  3. using namespace std;   
  4.   
  5. class Singleton   
  6. {   
  7. private:   
  8.     Singleton() { };   
  9.   
  10. public:   
  11.     static Singleton& getInstance()   
  12.     {   
  13.         static Singleton uniqueInstance;   
  14.   
  15.         return uniqueInstance;   
  16.     }   
  17.   
  18.     ~Singleton()   
  19.     {    
  20.         cout << "소멸자 호출" << endl;   
  21.     };   
  22. };   
  23.   
  24. void main()   
  25. {   
  26.     Singleton::getInstance();   
  27. }  





  1.  
이렇게 수정하면 소멸자 호출이 됩니다.
왜냐하면...
static Singleton uniqueInstance;
여기서 uniqueInstance 자체가 포인터가 아니라 일반 인스턴스(객체)이기 때문입니다. 



이 글을 공유하기

댓글

Designed by JB FACTORY