【发布时间】:2010-06-05 20:38:31
【问题描述】:
您好,
我遇到了一个奇怪的段错误问题。我的应用程序在运行时转储了一个核心文件。挖掘后发现它死在了这个街区:
#include <lib1/c.h>
...
x::c obj;
obj.func1();
我在库 lib1 中定义了类 c:
namespace x
{
struct c
{
c();
~c();
void fun1();
vector<char *> _data;
};
}
x::c::c()
{
}
x::c::~c()
{
for ( int i = 0; i < _data.size(); ++i )
delete _data[i];
}
在我对 lib1.so 文件运行 nm 之前,我一直无法弄清楚:函数定义比我定义的要多:
x::c::c()
x::c::c()
x::c::~c()
x::c::~c()
x::c::func1()
x::c::func2()
在代码库中搜索后,我发现其他人在同一个命名空间中定义了一个同名的类,但在另一个库 lib2 中如下:
namespace x
{
struct c
{
c();
~c();
void func2();
vector<string> strs_;
};
}
x::c::c()
{
}
x::c::~c()
{
}
我的应用程序链接到依赖于 lib1 的 lib2。这种有趣的行为带来了几个问题:
为什么它会起作用?在链接 lib2(取决于 lib1)时,我预计会出现“多个定义”错误,但从未有过这样的错误。该应用程序似乎正在执行 func1 中定义的操作,只是它在运行时转储了一个核心。
附加调试器后,我发现我的应用程序调用了lib2中c类的ctor,然后调用了func1(在lib1中定义)。当超出范围时,它会调用 lib2 中 c 类的 dtor,其中会发生 seg 错误。谁能教我这怎么可能发生?
如何防止此类问题再次发生?有什么我可以使用的 C++ 语法吗?
忘了说我在 RHEL4 上使用的是 g++ 4.1,非常感谢!
【问题讨论】:
标签: c++