gcc,c ++:静态字符串成员variarible导致堆损坏/分段错误

时间:2010-08-19 15:09:15

标签: c++ gcc heap shared-libraries corruption

我有一个使用动态加载库的大型应用程序。在程序结束时终止它或者是段错误或者发出消息“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;

我不知道发生了什么。 真正感谢这方面的任何帮助/指导。

2 个答案:

答案 0 :(得分:1)

我的猜测是你最终得到了IfTrackerFile::AubFileName的两个不同副本。一个是在动态加载utilities.a时从dynamicallyloaded.so直接将其拉入程序中。我猜这困扰了系统在程序关闭时破坏所有静态和全局对象,你最终调用了两次析构函数。

我认为你不应该以这种方式混合.a和.so文件。基本上,一个好的经验法则是永远不要将.so文件与.a相关联,即使您将-fPIC代码放在.a中。

答案 1 :(得分:0)

这是在黑暗中拍摄的,但问题可能是全局物体。将类实例化为全局变量意味着在调用main()之前实例化变量。这意味着在main()启动之前调用构造函数,并在main完成之后调用析构函数。调用构造函数和析构函数的顺序也是不确定的。

我的建议是将所有全局对象(非普通旧数据的全局变量 - POD - 类型)转换为指针,这些指针在main的开头实例化并在main的末尾被销毁。