我想写"现代C ++" Qt应用程序,意味着尽可能多的RAII。因此,我问自己,如果可能的话,使用自动分配是否安全:
#include <QApplication>
#include <QtWidgets>
int main(int argc, char **argv) {
QApplication app{argc, argv};
QWidget window{};
window.setWindowTitle("Der eine Knopf");
QPushButton button{"Ende"};
QObject::connect( &button, SIGNAL(clicked()), &app, SLOT(quit()));
QVBoxLayout layout{};
layout.addWidget(&button);
window.setLayout(&layout);
window.show();
return app.exec();
}
原始教程代码有很多指针和堆:
#include <QApplication>
#include <QtWidgets>
int main(int argc, char **argv) {
QApplication app{argc, argv};
QWidget window{};
window.setWindowTitle("Hallo Qt");
QPushButton button = new QPushButton("Ende");
QObject::connect( button, SIGNAL(clicked()),
&app, SLOT(quit()));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(button);
window.setLayout(layout);
window.show();
return app.exec();
}
我知道Qt的QObject
s的所有权概念。所以我假设第二个例子是正确的。我认为setLayout
和addWidget
也会更改所有权,因此我不需要明确delete
作为客户。
假设我想知道 - 为什么我的第一个例子呢?如果这些方法获得所有权,他们最终不会delete
新获得的孩子吗?如果他们这样做,我的程序会不会崩溃,因为对象被删除了两次? (程序不会崩溃,我会提到这一点。但这可能是偶然的,对吧?)
我现在非常困惑谁拥有谁以及它如何运作我不知道它怎么可能。我听到的一条规则是&#34; Qt会照顾到这个&#34; - 但&#34;什么&#34;?什么不是?
嗯,显然我是Qt的新手,我想要的是对QObject
构造函数和析构函数计数的一些见解。或每个建筑和/或销毁的消息。在Qt有这样的设施吗?
答案 0 :(得分:2)
如果你看一下object trees and ownership,当你使用自动分配时,你必须注意创建的顺序。 本地对象的析构函数按其构造函数的相反顺序调用。
所以在你的例子中:
int main(int argc, char **argv) {
QApplication app{argc, argv};
QWidget window{};
window.setWindowTitle("Der eine Knopf");
QPushButton button{"Ende"};
QObject::connect( &button, SIGNAL(clicked()), &app, SLOT(quit()));
QVBoxLayout layout{};
layout.addWidget(&button);
window.setLayout(&layout);
window.show();
return app.exec();
}
在此创建一个名为QWidget
的{{1}}对象。然后创建一个window
。您为窗口小部件设置了布局,并将QPushButton
添加到该布局。布局会自动将button
设置为window
的父级。但是当您退出应用程序并且范围结束时,button
将首先被销毁。在它被毁坏后,它将从button
的儿童名单中删除。所以它不会被摧毁两次。
但是,如果您在window
之前创建button
,window
将在window
之前被销毁,并且还将销毁其所有儿童。这意味着它还将调用button
的析构函数。在此之后,button
的析构函数将在超出范围时再次被调用。所以在这里你会有一个大问题。