質問

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

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

役に立ちましたか?

解決

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

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

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top