5

我到处都看到了如下的 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 文档中找到可以保证这一点的地方,有人可以指出我,这样我就可以保证这在未来不会改变?

4

1 回答 1

2

我相信标准 C++ 可以保证在派生构造函数之前执行基本构造函数,尽管我不能引用标准中的章节。也就是说,可以保证QObject 的析构函数将始终销毁该 QObject 的任何子级。

Qt 约定是指针传递给 QObject 或 QWidget 构造函数的 QObject 将成为新构造对象的父对象。因此,当您传递thisbutton的 ctor 时,button将成为 的子级myDialogmyDialog由于那时已经构建了 QObject 部分,我相信您可以放心地依赖该功能。

编辑:我应该在上面给出的示例中补充一点,虽然由于构造函数button的原因,它开始作为子级,但在添加到并成为的孙子级时,它会重新成为父级,它仍应被其 QObject 析构函数删除。myDialoglayoutmyDialog

于 2012-11-16T23:15:30.640 回答