c++ - 段错误调用函数

标签 c++ qt gdb segmentation-fault

我有以下类层次结构:

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()

的调用出现段错误后进行的探测
(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”,它不会出现段错误,但我不明白为什么会有所不同。我应该在哪里寻找问题的根源?

最佳答案

确保任何QObject 都分配在堆上,而不是堆栈上。他们在筹码上玩得不太好。

关于c++ - 段错误调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8968626/

相关文章:

javascript - 奇怪的浏览器描述PyQt

c++ - 向 Q_Object 构造函数添加参数

c++ - 使用制表符完成打印变量时 gdb 卡住

c - 将输出从 gdb 重定向到一个文件

c++ - 在可变模板参数上实现数学补码逻辑

c++ - 使用声明作为覆盖

c++ - 如何使用 QProcess 在控制台窗口中启动和稍后终止 cmd.exe

debugging - 无法在 gdb 中禁用分页

具有临时消除功能的 C++ OpenCL 矩阵库

c++ - 在 Eigen 3.1.0-alpha1 中返回稀疏矩阵