2

C++ のシングルトン オブジェクトで問題に直面しています。説明は次のとおりです。

問題情報: 4 つの共有ライブラリ (libA.so、libB.so、libC.so、libD.so など) と、ファイルを処理する別の共有ライブラリ (libE.so など) を使用する 2 つの実行可能バイナリ ファイルがあります。

libE.so の目的は、データをファイルに書き込むことです。実行可能ファイルが再起動するか、ファイルのサイズが特定の制限を超えると、ファイルは圧縮され、名前にタイム スタンプが付けられた新しいファイルが作成されます。シングルトンオブジェクトを使用しています。シングルトンを取得および使用するためのハンドラー クラスをエクスポートします。圧縮は、上記の 2 つのケースでのみ発生します。ユーザー/ローダー実行可能ファイルは、ファイルの開始名のみを指定できますが、ハンドラー クラスによって提供されるその他の制御はありません。

libA.so、libB.so、libC.so、libD.so の動作はほぼ同じです。それらはすべて、libE.so でシングルトンのインスタンスを取得し、さらなる目的のためにそれを使用するハンドラーのクラスと宣言およびオブジェクトを持っています。

これらのライブラリはすべて、2 つの実行可能なバイナリ ファイルにリンクされています。2 つの実行可能ファイルの 1 つだけが実行される場合は問題ありませんが、両方の実行可能ファイルが次々に実行される場合は、最初に開始された実行可能ファイルのファイルが圧縮されます。

デバッグ情報: シングルトン オブジェクトのコンストラクタとデストラクタが 2 回呼び出されます (実行可能ファイルごとに)。

シングルトンのオブジェクトは静的オブジェクトであり、削除されることはありません。

実行可能ファイルは終了/戻ることができません:

* glibc が検出されました * (exe1 または exe2): 二重解放または破損 (!prev): some_addr *

バイナリ valgrind で実行すると、上記のエラーはシングルトン オブジェクトのデストラクタが原因であることがわかります。

ありがとう

4

0 に答える 0