4

静的なstlコンテナクラスを含むクラス「A」を持つプロジェクトに取り組んでいます。このクラスは、私のメインプログラムと.soファイルの両方に含まれています。このクラスは、デフォルト(暗黙的、宣言されていない)コンストラクタ/デストラクタを使用します。メインプログラムは、dlopen()を使用して.soファイルをロードし、そのデストラクタでdlclose()を呼び出します。glibcが静的クラスメンバー変数のデストラクタを呼び出すと、メインが終了した後にプログラムがクラッシュします。問題は、dlclose()が呼び出されると、静的変数のデストラクタが呼び出され、次にmain exits()がデストラクタも呼び出すと、ダブルフリーが発生することです。

2つの質問があります
。1)この特定のケースでは、静的変数のコピーが2つないのはなぜですか(はい、それはややばかげているように聞こえますが、メインプログラムと.soファイルの両方に別々にコンパイルされた「A」があるためです、それぞれに1つあるべきではありませんか?)
2)静的メンバー変数を含まないようにクラス「A」を書き直さずにこの問題を解決する方法はありますか?

4

2 に答える 2

2

この質問は、私が投稿した別の質問で解決されました。基本的に、静的変数の2つのコピーが実際にありました。1つはメインプログラムに、もう1つは共有ライブラリにありましたが、ランタイムリンカーは両方のコピーをメインプログラムのコピーに解決していました。詳細については、次の質問を参照してください。

メインプログラムと共有ライブラリは、__static_initialization_and_destruction_0で同じ静的変数を初期化します

于 2010-04-13T20:14:12.890 に答える
0

STLクラスは常に動的に作成されるため、実際に静的と呼ぶことはできないと思います。それらはヒープ上に存在します。メンバーが関数に渡されると、コピーが静的メモリに入れられます。stlを明示的に1回削除する独自のデストラクタを作成する必要があります。

于 2010-04-13T03:37:46.160 に答える