考虑以下代码,用于在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()
?
答案 0 :(得分:0)
首先我要承认,我不在这里。也就是说,谷歌搜索发现了一个线程,至少在我有限的知识,似乎解决了类似的问题:
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
函数来克服这些问题