带有 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
构造函数(我假设QWidget
是QWidget_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