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

static variable destructor invoked before library destructor

本文关键字:析构函数 静态 变量 调用      更新时间:2023-10-16

考虑以下代码,用于在linux, -fPIC上使用g++-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(); }

对我来说有趣/恼人的部分是,library_fini()在我调用lt_dlclose之后没有被调用,所以它似乎对于终结是相当无用的,因为当我在运行期间加载这个模块时,Wrapper实例的析构函数在调用library_fini之前发生。不用说,这种默认行为没有任何意义。

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

让我首先承认,我在这一点上是无能为力的。也就是说,谷歌上出现了一个帖子,至少就我有限的知识而言,似乎解决了与你的问题类似的问题:

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

你是否碰巧在OSX上做你正在做的事情?线程中(可能是第二个后续)关于OSX的行为不同,即不调用析构函数,而只是将内存设置为空闲。

如果链接没有用,请道歉。我只是想试一试,因为现在还没有人接电话。

<标题>编辑:

再次超出我的深度-但我发现了两个可能相关的链接:

    http://phoxis.org/2011/04/27/c-language-constructors-and-destructors-with-gcc/
    • 在评论中,人们提到在使用exit时遇到析构函数的问题,并且必须使用atexit函数来克服这些问题
  1. http://clang-developers.42468.n3.nabble.com/Priority-settings-for-static-variables-and-attribute-destructor-td4030466.html
    • 属性 ((destructor)))函数被调用之前被销毁的
    • 全局资源。建议的解决方案是在析构函数中使用优先级。