我有一个使用动态加载库的大型应用程序。在程序结束时终止它或者是段错误或者发出消息“glibc检测到损坏的双链表”。看看valgrind的输出,我认为情况就是这样: 假设我们有三个文件:
utilities.c - compiled with -fPIC and used ar and ranlib to create utilities.a.
dynamicallyloaded.c- compiled with -fPIC and -shared and linked with utlities.a to generate dynamicallyloaded.so
main.c - compiled with -fPIC and linked with utilities.a to create main. main dynamically loads and uses dynamicallyloaded.so .
utilities.h - delclared a class IfTrackerFile with AubFileName as a static string member like static string AubFileName;
utilities.cpp - defines the static variable: string IfTrackerFile::AubFileName;
valgrind out表示该行上有无效的免费/删除/删除: string IfTrackerFile :: AubFileName;
我不知道发生了什么。 真正感谢这方面的任何帮助/指导。
答案 0 :(得分:1)
我的猜测是你最终得到了IfTrackerFile::AubFileName
的两个不同副本。一个是在动态加载utilities.a
时从dynamicallyloaded.so
直接将其拉入程序中。我猜这困扰了系统在程序关闭时破坏所有静态和全局对象,你最终调用了两次析构函数。
我认为你不应该以这种方式混合.a和.so文件。基本上,一个好的经验法则是永远不要将.so
文件与.a
相关联,即使您将-fPIC
代码放在.a
中。
答案 1 :(得分:0)
这是在黑暗中拍摄的,但问题可能是全局物体。将类实例化为全局变量意味着在调用main()之前实例化变量。这意味着在main()启动之前调用构造函数,并在main完成之后调用析构函数。调用构造函数和析构函数的顺序也是不确定的。
我的建议是将所有全局对象(非普通旧数据的全局变量 - POD - 类型)转换为指针,这些指针在main的开头实例化并在main的末尾被销毁。