【问题标题】:The segmentation fault is resolved, but cannot figure out why分段错误已解决,但无法弄清楚原因
【发布时间】:2018-11-07 16:51:09
【问题描述】:

头文件包含:

class WorkScene;
class Mesh;

class Director
{
private:
    WorkScene *scene            = nullptr; // owner
    Mesh      *selected_mesh    = nullptr; // borrower
public:
    Director(WorkScene *scene);
    ~Director();

    const Mesh *get_selected_mesh() const;
    Mesh *get_selected_mesh();
};

get_selected_mesh方法的实现是:

cvas::p3de::Mesh *cvas::p3de::Director::get_selected_mesh()
{
    return selected_mesh;
}

但是我在这一行收到分段错误:


分段错误错误文本为:

下级停止了,因为它收到了操作员的信号 系统。

信号名称:SIGSEGV

信号含义:分段错误


像这样修改代码时解决了分段错误

cvas::p3de::Mesh *cvas::p3de::Director::get_selected_mesh()
{
    //return selected_mesh;
    return nullptr;
}

好吧,考虑到在头文件内部,selected_mesh 标识符已经声明/初始化,我无法弄清楚 为什么在修改上述代码时解决了分段错误作为nullptr。谁能给个提示?

【问题讨论】:

  • 为什么你显示完整的屏幕,而不仅仅是错误信息?为什么不以文本形式提供错误消息。文字可搜索,图片不可搜索。
  • 您的this 指针是nullptr。在 nullptr this 上调用成员函数是未定义的行为。错误出现在您未显示的代码中。
  • @WernerHenze 对,我将提供错误文本消息。
  • edit你的问题告诉我们你做了什么样的调试。我希望您已经在 Valgrind 或类似的检查器中运行了您的minimal reproducible example,并使用诸如 GDB 之类的调试器进行了调查。确保您也启用了全套编译器警告。这些工具告诉了你什么,它们缺少什么信息?并阅读 Eric Lippert 的 How to debug small programs
  • @TobySpeight 非常感谢。我将研究您提供的链接。我正在使用带有默认设置的 QtCreator 进行调试,而默认设置又使用了 GDB。我想我需要在调试器配置上做一些工作。

标签: c++ qt segmentation-fault


【解决方案1】:

您似乎有一个Director*,即nullptr,然后您在该指针上调用get_selected_mesh。这是未定义的行为。

如果你只是return nullptr,编译器并不关心,只返回nullptr。在您return selected_mesh 的情况下,编译器事实上需要执行return this->selected_mesh。这会取消引用无效的this,从而取消访问冲突。

错误出现在您未显示的代码中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多