2012-07-11 126 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