c++ - 如果从 QObject 派生的类的构造函数抛出,是否会发出 destroyed()?

标签 c++ qt qobject

我到处都看到像下面这样的 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/

相关文章:

c++ - 转置数组

c++ - 将带有空格的十六进制字符串拆分为Qt中的bytearray

python - 使用 PyQt5 将 qDebug 输出重定向到文件

qt - 如何从父级中删除 QObject

c++ - 在 QObject 派生类中重复 Q_DISABLE_COPY

c++ - C++ 中的字符指针

c# - 通过 Interop 调用返回结构实例的方法

qt - TreeView - 如何使用角色作为图像源

qt - Qt5 中的 glGenBuffers 在哪里?

javascript - 仅在通过脚本访问时未定义属性