2013-04-02 56 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

    • 全球资源破坏之前属性((析构))函数被调用。建议的解决方案是在析构函数中使用优先级。