2013-04-02 121 views
1

考慮使用g ++構建一個動態加載的庫下面的代碼之前調用 - 在Linux上,-fPIC 4.7與-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(); } 

對我來說是有趣/惱人的是,我調用lt_dlclose後沒有調用library_fini(),所以對於最終確定來說似乎沒用,因爲當我在運行期間加載此模塊時,Wrapper實例的析構函數發生之前調用library_fini。不用說,這種默認行爲沒有任何意義。

我該如何改變這種毫無意義的行爲?我需要在我的庫定稿例程中完成我的靜態數據。爲什麼lt_dlclose未調用library_fini()

回答

0

讓我先承認我在這裏沒有深度。儘管如此,谷歌搜索變成了一個線程,至少我有限的知識,似乎解決了類似的問題對你:

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

你碰巧做任何你正在做的OSX?線程中有些東西(也許是第二個後續)關於OSX的行爲有所不同,即不調用析構函數,而只是將內存設置爲空閒。

道歉,如果鏈接沒有用。只是覺得我會走了,因爲在這一點上沒有其他人回答過。

編輯:

同樣,我的深度 - 但我發現兩個環節可能有關:

  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

    • 全球資源破壞之前屬性((析構))函數被調用。建議的解決方案是在析構函數中使用優先級。