Я работаю с 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;
}
Привет, что произойдет, если GetInstance() вызывается дважды подряд? Кажется, что в первом случае (случай, который работает) все в порядке, tS.Conn не вызывается дважды, поскольку конструктор не вызывается снова; однако во втором случае (в случае, когда ядро), во втором вызове getInstance(), tS._Conn переназначается и превалирующее соединение теряется ... Исправьте меня, если я ошибаюсь – GL770
Я только создаю _Conn один раз. Если я создам экземпляр в конструкторе, он работает. Если я создам экземпляр в getinstnace, вызовите его. – sfpiano