【问题标题】:QObject auto delete orderQObject 自动删除顺序
【发布时间】:2017-12-30 05:17:34
【问题描述】:

我有示例代码:

#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

auto(qt) 销毁操作的顺序是什么?

我可以假设破坏顺序(B,C)与创建顺序(新 B(a),新 C(a))相同吗?

为什么破坏顺序不是:A、C、B?

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    一旦在a 上调用delete,其子代bc 也将变为delete,其顺序与将它们添加到a 的子代集合中的顺序相同。 为了证明这一点,您可以在没有 parent 参数的情况下创建 bc,然后再调用 setParent:销毁顺序将与调用顺序相同。

    【讨论】:

      【解决方案2】:

      回答您的问题需要两条信息。首先是添加孩子的顺序。来自QObject::children() 的文档:

      添加的第一个子对象是列表中的第一个对象,添加的最后一个子对象是列表中的最后一个对象,即在末尾追加新的子对象。

      然后从 QObject 析构函数,deleteChildren() 函数会:

      for (int i = 0; i < children.count(); ++i) {
          currentChildBeingDeleted = children.at(i);
          children[i] = 0;
          delete currentChildBeingDeleted;
      }
      children.clear();
      

      所以它会按照它们添加到子列表中的顺序删除它们。


      对于除 UI 对象(即 QWidget 及其子类)之外的每个 QObject 子类都是如此。再次来自文档:

      请注意,当 QWidget 子级升高或降低时,列表顺序会发生变化。升起的小部件将成为列表中的最后一个对象,而降低的小部件将成为列表中的第一个对象。

      因此调用raise()lower() 会操纵列表,因此删除它们的顺序不再那么简单。但是对于非 UI 对象,它们会按照给定父对象的顺序被删除,无论是在构造函数中还是通过 QObject::setParent() 执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-17
        • 1970-01-01
        • 2019-03-25
        • 2020-02-11
        • 2010-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多