1

Linux で g++-4.7 を使用してビルドされ、オプション -fPICでリンクされた動的ロード ライブラリの次のコードを検討してください。-rdynamic

struct Wrapper
{
    libraryUnregisterCbMap_t instance;
    Wrapper() : instance() { HDebugLog("Wrapper CTOR!");}
    ~Wrapper() { HDebugLog("Wrapper DESTRUCTOR!"); }
};
inline libraryUnregisterCbMap_t& getLibraryUnregisterMap()
{
    static Wrapper unregisterLibraryMap;
    HDebugLog("getLibraryUnregisterMap: we have " <<unregisterLibraryMap.instance.size() << " elements. the address of the map is " << &unregisterLibraryMap.instance);
    return unregisterLibraryMap.instance;
}

void registerLibrary(callbackContainer_t* p)
{
  auto& map = getLibraryUnregisterMap();
}

void unregisterLibrary()
{
  auto& map = getLibraryUnregisterMap();
}

void __attribute__ ((constructor)) library_init()
{
  static callbackContainer_t cbContainer;
  HDebugLog("Library constructor: address of static cbContainer is: " << &cbContainer );
  registerLibrary( &cbContainer);
} 
void __attribute__ ((destructor)) library_fini()
{ unregisterLibrary(); }

私にとって興味深い/厄介な部分は、を呼び出した後に library_fini() が呼び出されていないことです。そのため、実行中にこのモジュールをロードすると、インスタンスのデストラクタがへの呼び出しのlt_dlcloseに発生するため、ファイナライズにはあまり役に立たないようです。言うまでもなく、このデフォルトの動作には意味がありません。Wrapperlibrary_fini

この無意味な振る舞いを変えるにはどうすればよいですか? ライブラリのファイナライズ ルーチンで静的データをファイナライズする必要があります。lt_dlcloseが呼び出されないのはなぜlibrary_fini()ですか?

4

1 に答える 1

0

最初に、私がここで私の深みから外れていることを認めさせてください. そうは言っても、グーグルは、少なくとも私の限られた知識では、あなたと同様の問題に対処しているように見えるスレッドを見つけました:

http://lists.apple.com/archives/xcode-users/2005/Aug/msg00133.html

OSXでやっていることをたまたまやっていますか?OSX の動作が異なる、つまり、デストラクタを呼び出さずにメモリを解放するように設定することについて、スレッド (おそらく 2 番目のフォローアップ) に何かがあります。

リンクが役に立たない場合はお詫び申し上げます。この時点で誰も答えていないので、試してみようと思いました。

編集:

繰り返しますが、私の深さではありませんが、関連する可能性のあるリンクがさらに2つ見つかりました。

  1. http://phoxis.org/2011/04/27/c-language-constructors-and-destructors-with-gcc/

    • コメントでは、人々は を使用するときにデストラクタに問題があり、これらの問題を克服するために関数をexit使用する必要があると述べていますatexit
  2. http://clang-developers.42468.n3.nabble.com/Priority-settings-for-static-variables-and-attribute-destructor-td4030466.html

    • 属性((デストラクタ)) 関数が呼び出される前に破棄されたグローバル リソース。推奨される解決策は、デストラクタで優先順位を使用することです。
于 2013-04-02T05:34:38.287 に答える