我有示例代码:
#include <QCoreApplication>
#include <QTimer>
#include <cstdio>
using namespace std;
class A : public QObject
{
public:
~A() { printf("destructor A\n"); }
};
class B : public QObject
{
public:
B(QObject * parent) : QObject(parent) { }
~B() { printf("destructor B\n"); }
};
class C : public QObject
{
public:
C(QObject * parent) : QObject(parent) { }
~C() { printf("destructor C\n"); }
};
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
auto * a = new A;
auto * b = new B(a);
auto * c = new C(a);
delete a;
QTimer::singleShot(30000, &app, &QCoreApplication::quit);
return app.exec();
}
执行上面的应用程序给我这个结果:
destructor A
destructor B
destructor C
自动(qt)销毁操作的顺序是什么?
我可以假设破坏顺序(B,C)与创建顺序相同(新B(a),新C(a))?
为什么破坏的顺序不是:A,C,B?
一旦delete
被召唤到a
,它的孩子b
和c
也是delete
'd,就像它们加入a
的儿童收藏品的顺序一样。为了证明这一点,你可以在没有父参数的情况下创建b
和c
,然后再调用setParent
:破坏的顺序与调用的顺序相同。
回答您的问题需要两条信息。首先是添加孩子的顺序。来自QObject::children()
的文档:
添加的第一个子项是列表中的第一个对象,添加的最后一个子项是列表中的最后一个对象,即最后添加新子项。
然后从QObject
析构函数,deleteChildren()
函数做:
for (int i = 0; i < children.count(); ++i) {
currentChildBeingDeleted = children.at(i);
children[i] = 0;
delete currentChildBeingDeleted;
}
children.clear();
所以它按照它们被添加到子列表中的顺序删除它们。
除了UI对象(即QObject
及其子类)之外,每个QWidget
子类都是如此。再次来自文档:
请注意,当QWidget子项被提升或降低时,列表顺序会更改。引发的窗口小部件将成为列表中的最后一个对象,并且已降低的窗口小部件将成为列表中的第一个对象。
因此,调用raise()
或lower()
会操纵列表,因此删除它们的顺序不再那么简单。但对于非UI对象,它们按照给定父对象的顺序删除,无论是在构造函数中还是通过执行QObject::setParent()
。