带有 QWidget 的分段错误构造函数。 Qt/C++

Posted

技术标签:

【中文标题】带有 QWidget 的分段错误构造函数。 Qt/C++【英文标题】:Segmentation Fault constructor with QWidget. Qt/C++ 【发布时间】:2016-04-26 20:04:23 【问题描述】:

我有这个问题。 有时(但很少)我的程序在启动时崩溃。 QDebugger 指向源自此代码的分段错误:

view_add_bagagli::view_add_bagagli(QWidget*parent):QWidget(parent),setBagWid(new QWidget_add_lug(this)),
setPropWid(new QWidget_add_owner(this)),
setViaWid(new QWidget_add_travel(this)) // segm fault at this line

这是 QWidget_add_travel 的构造函数的代码:

QWidget_add_travel::QWidget_add_travel(QWidget *parent) : Qwidget(parent),via_l(new QVBoxLayout())
    setLayout(via_l);
    build();

但是 QDebugger 并没有在这段代码中指出分段错误。 最奇怪的是分段错误有时(很少)发生,而不是每次都发生! 也许这不是一个好问题,但我对这个错误很困惑。

【问题讨论】:

可能你的堆损坏了。 这到底是什么意思?我认为它只发生在删除运算符 是否有可能此代码位于您在指针上调用的成员函数中,由于某些错误原因,该指针有时可能为 nullptr? 我说错误不在您提供的代码中,因此很难给出建议。虽然@Christophe 有一个很好的观点。 请多贴一些周边代码 【参考方案1】:

您没有在构造函数中调用QWidget 构造函数(我假设QWidgetQWidget_add_travel 的超类)。由于未调用超类的构造函数,因此在堆上为您的小部件分配的数据处于未定义 状态,即迟早会发生故障。

这是一个固定版本:

QWidget_add_travel::QWidget_add_travel(QWidget *parent) 
        : QWidget(parent), via_l(new QVBoxLayout(this))

    build();

我还冒昧地通过将this 传递给布局构造函数来简化您的布局构造。

【讨论】:

不,这不是解决方案,因为最初我的代码就像你说的那样。 @CodeBott 然后您应该提供一个最小但完整的示例来重现段错误以获得帮助。 @Murphy 这就是例子。 Segm 错误恰好在此代码运行时发生。此外,QDebugger 指向此代码 @CodeBott 正如其他人也指出的那样,它不完整。你不能将它复制到一个空的项目中,编译并运行它。请阅读minimal reproducible example。 请注意构造函数中的: QWidget(parent)调用。这确实与提供的代码不同。

以上是关于带有 QWidget 的分段错误构造函数。 Qt/C++的主要内容,如果未能解决你的问题,请参考以下文章

默认构造函数的分段错误

Qt 必须在 QWidget 之前构造 QApplication

qt 信号导致连接时出现分段错误

构造函数内部变量的定义会导致分段错误

必须在传递给 C 运行时函数的 QWidget 和无效参数之前构造一个 QApplication

Qt ------ 初始化构造函数参数,parent