2012-07-11 3 views
0

qpid 메시징 라이브러리로 작업하고 있습니다. 연결 개체를 보유하는 싱글 톤 클래스가 있습니다. 연결이 어떻게 생성되었는지에 따라 응용 프로그램이 종료 될 때 핵심이되는 것으로 나타났습니다. 싱글 톤 생성자 또는 정적 메서드로 만들었다면 모든 것이 좋았습니다. 그러나 비 정적 메서드 나 getinstance 메서드에서 아래 표시된 것처럼 메시징 라이브러리를 만들면 내 소멸자가 호출되기 전에 내부적으로 close 메서드가 호출됩니다. 그것은 중단을 호출합니다. 나는 이러한 창조 호출이 다른 결과를 가져올 수있는 것과 다른 것에 대해 궁금해하고있었습니다.생성자와 메소드의 싱글 톤 함수 호출

class Singleton : public boost::noncopyable 
{ 
public: 

    static Singleton & 
    GetInstance() 
    { 
    static Singleton tS; 
    // If I create _Conn this way it cores 
    // tS._Conn = SharedConn(new Conn()); 
    return tS; 
    } 

private: 

    typedef boost::shared_ptr<Conn> SharedConn; 
    Singleton() 
    { 
    // If I create _Conn this way it works 
    //_Conn = SharedConn(new Conn()); 
    } 

    SharedConn _Conn; 
}; 

int main(int argc, char** argv) 
{ 
    Singleton::GetInstance(); 
    return 0; 
} 
+1

안녕하세요, GetInstance()가 두 번 연속 호출되면 어떻게됩니까? 그것은 첫 번째 경우 (작동하는 경우), 모든게 괜찮아 보인다. tS.Conn은 생성자가 다시 호출되지 않기 때문에 두 번 호출되지 않는다. 그러나 두 번째 경우 (코어 경우) getInstance()에 대한 두 번째 호출에서 tS._Conn이 다시 할당되고 이전 연결이 손실됩니다 ... 잘못된 경우 수정하십시오. – GL770

+0

한 번만 _Conn을 인스턴스화합니다. 생성자에서 인스턴스화하면 작동합니다. getinstnace에서 인스턴스화하면 코어라고 부릅니다. – sfpiano

답변

0

GetInstance에서 _Conn을 다시 만드는 이유가 있습니까? 그 시점에서 생성자는 이미 한 번 생성했습니다. 따라서 _Conn에 다시 할당하면 이전 인스턴스의 소멸자 (및 닫기) 호출이 발생할 수 있습니다.

+0

죄송합니다. 실제로 두 가지 방법을 함께 호출하지 않습니다. 충돌을 일으키지 않으면 생성자에서 인스턴스화 만하고 충돌이 발생하면 getinstance 메소드에서 인스턴스화 만합니다. – sfpiano

+0

그래서 getinstance를 사용할 경우 생성자가 비어 있습니까? – Jari

+0

네, 맞습니다. – sfpiano