linux在动态库中使用STL时出现Segmentation fault.
下面是A.cpp文件的基本代码,编译成动态库的形式
g++ -fPIC -shared -lpthread -o libA.so
typedef std::list<std::string> StringList;
class A
{
public:
A();
public:
StringList m_listBuff;
void Init();
};
A::A()
{
m_listBuff.clear();
}
void A::Init()
{
//用gdb调试在此处调用size时候崩溃
printf("size = %d\n", m_listBuff.size());
}
A g_a;
////////////////////////////////////////////
//动态库导入
void InitSO(void) __attribute__((constructor));
void InitSO(void)
{
g_a.Init();
}
编译成so后,将so编译时加入测试程序Test.cpp,测试程序什么都不做。
g++ -g Test.cpp -o Test -L. -lA
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char * argv [])
{
getchar();
return 0;
}
然后用gdb调试Test,在动态库初始化的时候,调用void A::Init()总会出现Segmentation fault.
难道在在动态库中不能调用string的size获取大小么?
[最优解释]
看看此时类的各个成员变量,段错误一般是非法指针导致的.
[其他解释]
程序分段。。。。内存没搞好!!!
A::A(){ m_listBuff.clear();}
[其他解释]
已经发现问题所在,谢谢各位答复。
[其他解释]
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。