我到处都看到像下面这样的 Qt GUI 语法:
myDialog::myDialog(QWidget *parent, Qt::WFlags flags):QDialog(parent, flags)
{
QPushButton *button = new QPushButton("&Download", this);
QVBoxLayout *layout = new QVBoxLayout(this);
//something that can throw here
layout ->addWidget(button );
setLayout(layout);
}
我一直想知道这是否会在发生异常时泄漏,因为我作为父项给按钮和布局的“this”没有完全构建,所以它可能不会破坏它的子项。
我在 MSVC2010 Qt4.8.3 中尝试过它,看起来一旦基本 QObject 类完全创建(当然首先完成)就可以将“this”传递给构造函数中的其他对象,它们将被正确销毁。
虽然我没有在 Qt 文档中找到保证这一点的地方,但有人可以指点我,以便我保证这在未来不会改变吗?
最佳答案
我相信这是标准的 C++ 来保证 base constructor is executed prior to derived constructors ,虽然我不能引用标准中的章节和诗句。也就是说,可以保证 QObject's destructor将始终销毁该 QObject 的所有子对象。
Qt 约定是,其指针传递给 QObject 或 QWidget 构造函数的 QObject 将成为新构造对象的父对象。因此,当您将 this
传递给 button
的构造函数时,button
成为 myDialog
的子级。由于那时 myDialog
的 QObject 部分已经构建,我相信您可以放心地依赖该功能。
编辑:我应该在上面给出的示例中添加这一点,尽管 button
由于构造函数而开始作为 myDialog
的子项,但在添加到 layout
并成为 myDialog
的孙子,它仍应被其 QObject 析构函数删除。
关于c++ - 如果从 QObject 派生的类的构造函数抛出,是否会发出 destroyed()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13425601/