2012-07-11 129 views
0

我正在使用qpid消息庫。我有一個持有連接對象的單例類。我注意到我的應用程序將核心退出取決於我如何創建連接。如果我在單例構造函數或靜態方法中創建它,一切都很好,但是如果我使用非靜態方法創建它,或者在我的getinstance方法中創建它,則消息庫在調用析構函數之前會在內部調用close方法它會調用一箇中止。我想知道這些創作電話是不同的,可能會導致這樣的結果。構造函數中的單例函數調用vs方法

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 2012-07-11 19:49:49

+0

我只實例化_Conn一次。如果我在構造函數中實例化它的作品。如果我在getinstnace中實例化它的核心。 – sfpiano 2012-07-11 20:02:24

回答

0

有沒有理由的GetInstance爲什麼你重新創建_conn。那時構造函數已經創建了一次。所以,重新分配給_Conn很可能導致調用前一個實例的析構函數(和關閉)。

+0

對不起,我實際上並沒有將這兩種方法調用在一起。當它不會崩潰時,我只在構造函數中實例化它,當它發生崩潰時,我只在getinstance方法中實例化它。 – sfpiano 2012-07-11 19:30:58

+0

那麼,如果你使用getinstance你的構造函數是空的? – Jari 2012-07-11 19:36:06

+0

是的,這是正確的。 – sfpiano 2012-07-11 19:44:06