QObject自动删除顺序

时间:2017-12-29 21:01:17

标签: c++ qt

我有示例代码:

#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?

2 个答案:

答案 0 :(得分:3)

delete上调用a后,其子bc也会delete',其顺序与a相同添加到b的儿童收藏中。 为了证明这一点,你可以在没有父参数的情况下创建csetParent,然后再调用{{1}}:破坏的顺序与调用的顺序相同。

答案 1 :(得分:1)

回答您的问题需要两条信息。首先是添加孩子的顺序。来自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()执行。