2012-07-11 3 views
0

Я работаю с qpid-библиотекой сообщений. У меня есть одноэлементный класс, который содержит объекты соединения. Я заметил, что мое приложение будет работать на выходе в зависимости от того, как я создал соединение. Если я создал его в singleton-конструкторе или статическом методе, все было в порядке, однако, если бы я создал его в нестационарном методе или в моем методе getinstance, как показано ниже, библиотека обмена сообщениями внутренне вызывала метод close до того, как был вызван мой деструктор и это вызовет прерывание. Мне было интересно, что происходит с этими вызовами создания, что может привести к такому результату.Вызов функции Singleton в конструкторе против метода

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

Есть ли причина, по которой вы воссоздаете _Conn в GetInstance. В этот момент конструктор уже создал его один раз. Таким образом, повторная привязка к _Conn скорее всего вызовет вызов деструктора (и закрытия) предыдущего экземпляра.

+0

Извините, я на самом деле не называю оба этих метода вместе. Когда он не падает, я только создаю экземпляр в конструкторе, и когда он сбой, я создаю экземпляр только в методе getinstance. – sfpiano

+0

Итак, если вы используете getinstance, ваш конструктор пуст? – Jari

+0

Да, это правильно. – sfpiano