앞에서 설명한 ( 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:
class CSingleton
{
static T* m_cInstance;
private:
static bool Create()
{
if( nullptr == m_cInstance )
{
m_cInstance= new T;
// 프로세스 종료 시 호출 될 함수 등록.
// 등록된 함수는 등록된 반대 순서로 호출.
atexit( Destroy );
{
m_cInstance= new T;
// 프로세스 종료 시 호출 될 함수 등록.
// 등록된 함수는 등록된 반대 순서로 호출.
atexit( Destroy );
return true;
}
return false;
}
return false;
}
static void Destroy()
{
SAFE_DELETE( m_cInstance );
//return true;
//return true;
}
protected:
CSingleton() {}
public:
CSingleton( const CSingleton& rhsSingleton );
~CSingleton() {}
static T* Instance()
~CSingleton() {}
static T* Instance()
{
Create();
return m_cInstance;
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;
}
=======================================================================================
출저 :
'[ Programing ] > Algorithm' 카테고리의 다른 글
[ 스코프 ( 곡선 ) ] cos( M_PI * lfPerTime / 2 ); (0) | 2010.02.01 |
---|---|
[ 흔들림 ] Shake (0) | 2010.02.01 |
Sington 정리. ( 동적 할당 + friend + atexit() ) (0) | 2010.01.12 |
Sington은 Friend로 사용하여 간단하게 만들자. (0) | 2009.12.28 |
CRC 데이터 전송 검증 (0) | 2009.12.28 |