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;
}
4

1 に答える 1

0

GetInstanceで_Connを再作成する理由はありますか。その時点で、コンストラクターはすでにそれを一度作成しています。したがって、_Connに再割り当てすると、前のインスタンスのデストラクタが呼び出される(および閉じる)可能性があります。

于 2012-07-11T19:27:13.613 に答える