code project 의 싱글톤

각 게시판의 주제에서 벗어나는 게시물을 삭제 전에 임시로 보관하는 곳입니다. 읽기 전용이나, 자신의 글을 삭제, 수정하는 것은 가능합니다.
Post Reply
masknecr
Posts: 2
Joined: 2007-01-22 15:40

code project 의 싱글톤

Post by masknecr »

template <typename>
class Singleton
{
public:
static T * Instance()
{
if (m_kInstance == NULL) m_kInstance = new T;
return m_kInstance;
};
static DestroyInstance()
{
delete m_kInstance;
m_kInstance = NULL;
};

private:
static T * m_kInstance;
};

template <typename> T* Singleton<T>::m_kInstance = 0;



출처:
http://gpgstudy.com/forum/viewtopic.php?t=5405

에서 카피한 코드입니다.

여기서 DestroyInstnace()라고 따로 함수를 만들었는데
이러지 않고 그냥 소멸자로
virtual ~Singleton () {
delete m_kInstance;
m_kInstance = NULL;
}

이것을 대신해서 쓰면 자동으로 호출하므로 더 편하지 않나요..? 가 아니라, 제 생각에서 틀린점을 좀 찾아주십시오. 뭔가 이유가 있어서 저렇게 안쓰시는거 같은데..

겟판을 잘못찾아왔으면 죄송합니다.. (--)(__)
nikola2
Posts: 886
Joined: 2005-07-12 01:19
Location: (주) 신규 소프트

Post by nikola2 »

그렇게 되었으면 좋겠지만, 안될것입니다...
예문의 싱글턴이라는 클래스는 완전이 정적으로 쓰이기로 되어 있습니다.

애초에 싱글턴 객체를 생성해서 쓰는게 아니고,
Singleton<Type>::Instance()와 같이 객체생성없이 직접 접근해 쓰이니까
소멸자가 호출될만한 객체를 갖지 않게 됩니다....
집사람이 국력이다...
mastercho
Posts: 587
Joined: 2004-05-09 20:37

Re: code project 의 싱글톤

Post by mastercho »

masknecr wrote:template <typename>
class Singleton
{
public:
static T * Instance()
{
if (m_kInstance == NULL) m_kInstance = new T;
return m_kInstance;
};
static DestroyInstance()
{
delete m_kInstance;
m_kInstance = NULL;
};

private:
static T * m_kInstance;
};

template <typename> T* Singleton<T>::m_kInstance = 0;



출처:
http://gpgstudy.com/forum/viewtopic.php?t=5405

에서 카피한 코드입니다.

여기서 DestroyInstnace()라고 따로 함수를 만들었는데
이러지 않고 그냥 소멸자로
virtual ~Singleton () {
delete m_kInstance;
m_kInstance = NULL;
}

이것을 대신해서 쓰면 자동으로 호출하므로 더 편하지 않나요..? 가 아니라, 제 생각에서 틀린점을 좀 찾아주십시오. 뭔가 이유가 있어서 저렇게 안쓰시는거 같은데..

겟판을 잘못찾아왔으면 죄송합니다.. (--)(__)

기분탓인가요? new로 생성되었으니, 소멸자가 호출되려면 delete가 되어야 합니다

하지만 새로 추가 하신 코드에선 소멸자에서 delete를 호출하는 코드가 있으므로 ,
서로 무한 재귀적 호출이 될거 같습니다
nikola2
Posts: 886
Joined: 2005-07-12 01:19
Location: (주) 신규 소프트

Re: code project 의 싱글톤

Post by nikola2 »

mastercho wrote: 기분탓인가요? new로 생성되었으니, 소멸자가 호출되려면 delete가 되어야 합니다

하지만 새로 추가 하신 코드에선 소멸자에서 delete를 호출하는 코드가 있으므로 ,
서로 무한 재귀적 호출이 될거 같습니다
--
말씀듣고 보니, 제가 질문글을 꼼꼼이 안 읽은것 같네요....첫 답글의 생각은
상속을 쓰지 않은 타입래퍼 유형의 싱글턴이라 여기고 쓴 것인데....
질문자님의 링크를 타보니, 상속기반 싱글턴 유틸리티네요..
--

동적 할당된 객체의 소멸자가 호출되기 위해서는 어차피 바깥에서 delete가 필요한 것인데,
소멸자 내부에서 자기 자신에 해당되는 객체를 delete하는 것은 앞뒤가 안맞겠죠...
집사람이 국력이다...
Post Reply