Segfaulting调用函数

时间:2012-01-23 08:04:07

标签: c++ qt gdb segmentation-fault

我有以下课程heirarchy:

ICSL::ISystemModel
ICSL::ISystemModelAffine : public ISystemModel
ICSL::Quadrotor::SystemModelQuadrotor : public QObject, ISystemModelAffine
ICSL::Quadrotor::SystemModelQuadrotorSimulated : public public SystemModelQuadrotor

然后,在另一个我定义的课程中

SystemModelQuadrotor mDynamicModelReal;
SystemModelQuadrotorSimulated mDynamicModelSimulated;

在初始化期间,我调用了一堆函数来设置mDynamicModelRealmDynamicModelSimulated上的变量,没有任何问题。稍后我会调用ISystemModel中的一些函数来访问一些适用于mDynamicModelReal但适用于mDynamicModelSimulated的段错误的变量。检查gdb,变量值是正确的,它似乎知道函数是什么,但它在尝试调用实际函数时抱怨(基于我对这些事情的有限理解)。这是gdb在对mDynamicModelSimulated.getName()

的调用进行segfaulted后进行探测
(gdb) print mDynamicModelSimulated.mName
$19 = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x810658 "quadGaui5"}}
(gdb) print mDynamicModelSimulated.getName
$20 = {const std::string (ICSL::ISystemModel * const)} 0x44f506 <ICSL::ISystemModel::getName()>
(gdb) print mDynamicModelSimulated.getName()
Cannot access memory at address 0x4082c00000000030

这是getName()

的定义
Class ISystemModel {
public:
...
virtual std::string const getName(){return mName;};
...
protected:
...
std::string mName;
...
};

我不明白为什么它不能进行该函数调用。我确实发现,如果我从函数定义中删除“virtual”,它不会出现段错误,但我不明白为什么会产生影响。我应该在哪里寻找问题的根源?

3 个答案:

答案 0 :(得分:1)

确保在堆上分配任何QObject,而不是堆栈。他们在筹码方面表现不佳。

答案 1 :(得分:0)

我猜你从不允许的构造函数中调用虚函数,可能会导致意外行为。你可以检查一下:)。

答案 2 :(得分:0)

一种可能性是您的虚拟表以某种方式损坏(堆/堆栈溢出或不正确的指针解除引用,如果可能的话),因此对getName()的虚拟调用失败。将其更改为非虚拟时,它会成功,因为它不会触及虚拟表。尝试对象上的其他虚拟调用,以查看是否还有其他任何操作。

如果它是腐败,那么它可能在此之前的任何时候发生。添加日志记录或跟踪并查看getName()的调用开始失败的位置。