在库析构函数之前调用静态变量析构函数
static variable destructor invoked before library destructor
考虑以下代码,用于在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
函数来克服这些问题
http://clang-developers.42468.n3.nabble.com/Priority-settings-for-static-variables-and-attribute-destructor-td4030466.html - 在评论中,人们提到在使用
- 属性 ((destructor)))函数被调用之前被销毁的
- 全局资源。建议的解决方案是在析构函数中使用优先级。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 未调用的初始化静态thread_local结构的构造函数和析构函数
- 即使没有析构函数,非静态类成员也会被销毁吗?
- 为什么不调用全局静态变量的析构函数
- C++-销毁顺序-函数的静态成员在主类析构函数之前被销毁
- 未调用静态全局结构的析构函数
- 为静态分配的变量手动调用析构函数
- 如果后代类没有非静态成员或析构函数,我是否需要虚拟析构函数
- 在静态对象的析构函数中使用cout
- 在带有msvc11的静态类析构函数中使用std::system_category()
- 静态对象的私有析构函数是如何调用的
- 从静态变量引用非静态变量会使非静态变量先于静态变量进行析构函数
- 全局静态常量shared_ptr被另一个shared_ptr的析构函数奇怪地窃取和删除,为什么?
- 尽管使用静态unique_ptr调用析构函数,但内存泄漏
- 离开 c++ 应用程序而不运行全局静态对象的析构函数
- 为什么在静态创建 OBJ 时调用私有析构函数
- C++禁用静态变量的析构函数
- 在元素自己的析构函数中擦除指向静态向量中元素的指针
- 静态字段的析构函数.辛格尔顿实现
- 多个线程调用exit()时的安全静态析构函数