在库析构函数之前调用的静态变量析构函数

时间:2013-04-02 05:11:06

标签: c++ g++ dynamic-linking dlopen

考虑以下代码,用于在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(); }

对我来说有趣/烦人的部分是我调用lt_dlclose后没有调用library_fini(),所以它似乎对于最终化没有用,就像我在运行期间加载这个模块一样,析构函数Wrapper个实例在library_fini调用前发生。不用说,这种默认行为没有任何意义。

我如何改变这种毫无意义的行为?我需要在我的库终结例程中完成我的静态数据。为什么lt_dlclose没有调用library_fini()

1 个答案:

答案 0 :(得分: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

    • 在调用属性((析构函数))函数之前销毁的全局资源。建议的解决方案是使用析构函数优先级。