블로그는 나의 힘!
[ Programing ]/Algorithm2010. 1. 31. 07:00
앞에서 설명한 ( Singleton은 Friend로 사용하여 간단하게 만들자. ) Singleton은 정적으로 만들었다.

정적으로 하면  문제점이 있다. 생성시 main 함수보다 빠르게 생성되고, 해제 시점이 컴파일러에서 마음대로 정해 버리기 때문.(effect c++ 본문 중.)  그렇게 때문에 동적으로 싱글톤을 구현하면 해결 가능해 진다.

하지만 역시 문제점은 사용자는 반드시 생성과 해제를 인식하고 써야 하기에 자칫 잘못하면 메모리 누수가 일어날 수 있는 것이 역시 동적 할당이다. 

이를 정적 싱글톤 사용처럼 편하게 하기 위해 atexit()를 사용해 보자.
그리고 이번 싱글톤은 friend를 사용하지 않고 일반적으로 만드는 싱글톤으로 만들었다.
friend로 함수를 접근하게 만들면 좀더 간편화 되고 깔끔하게 사용할 수 있지만, 싱글톤과 해당 클래스를 하나로 병합해야 하는 데 저렇게 사용하면 상속해서 사용할 수가 있으니 싱글톤이 많이 필요하고 상속으로 한번에 되는 장점이 있다.

필요 상황에 따라 friend로 싱글톤을 만들지, static으로 메소드를 만들지 판단을 하자!!!

참고 : atexit() 프로그램이 끝났을 때 호출 될 function을 등록한다. 등록된 함수는 등록된 반대 순서로 호출된다.


=======================================================================================

#define SAFE_DELETE(p)    { if(p) { delete(p);   (p)=0; } }

template< typename T >
class CSingleton
{
      static T* m_cInstance;

 private:
      static bool Create()
      {
           if( nullptr == m_cInstance ) 
           {
                m_cInstance= new T;

                // 프로세스 종료 시 호출 될 함수 등록. 
                // 등록된 함수는 등록된 반대 순서로 호출. 
                atexit( Destroy ); 
                return true;
           } 
           return false;
       } 

      static void Destroy()
     {
           SAFE_DELETE( m_cInstance );
           //return true;
     }  

 protected:
      CSingleton() {}          

 public:
      CSingleton( const CSingleton& rhsSingleton );
      ~CSingleton() {}

      static T* Instance()
     {
           Create();
           return m_cInstance;  
     }   
 };  

 template< typename T >
 T* CSingleton< T >::m_cInstance = nullptr;      // static initial  

 

=======================================================================================
EX )

#include "Singleton.h"
#include "tinyxml2.h"

class CToolConf : public CSingleton<CToolConf>
{
public:
     CToolConf( void );
     ~CToolConf( void );

     void Initialize();
     void Release();

public:
     BOOL LoadConf( const WCHAR* wszPath );

private:
     tinyxml2::XMLDocument m_xmlDoc;
     DBConnectInfo m_dbConnectInfo;
};

int main()
{
     WCHAR wszPath[CONF_BUFFER_SIZE] = L"./conf/tool_conf.xml";
     CSingleton<CToolConf>::Instance()->LoadConf( wszPath );

     getchar();
     return 0;



  
=======================================================================================

출저 : 

 copynull.tistory.com   - 디자인패턴 정리
 www.joinc.co.kr   - atexit() 설명  


 

 

Posted by Mister_Q