gpt4 book ai didi

c++ - Qt:解构期间的子QObject?

转载 作者:行者123 更新时间:2023-11-30 02:40:43 25 4
gpt4 key购买 nike

当父QObject被解构时,它的 child 什么时候被解构?例如:

QChild* child = new QChild(master);

当我们删除master时; master 的析构函数 ~Master() 将在 child 的析构函数之前或之后被调用?这里的顺序是什么?

最佳答案

~QObject() 会删除所有的 child ,准确的顺序你可以在源代码中找到。考虑 Qt source code :

QObject::~QObject()
{
Q_D(QObject);//now we have d-pointer
//...
//another code here, which for example disconnect everything
if (!d->children.isEmpty())
d->deleteChildren();
//...
}

在哪里deleteChildren()是:

void QObjectPrivate::deleteChildren()
{
const bool reallyWasDeleted = wasDeleted;
wasDeleted = true;
// delete children objects
// don't use qDeleteAll as the destructor of the child might
// delete siblings
for (int i = 0; i < children.count(); ++i) {
currentChildBeingDeleted = children.at(i);
children[i] = 0;
delete currentChildBeingDeleted;
}
children.clear();
currentChildBeingDeleted = 0;
wasDeleted = reallyWasDeleted;
}

另请参阅:http://www.programmerinterview.com/index.php/c-cplusplus/execution-order-of-constructor-and-destructor-in-inheritance/

另一个例子:

#include <QApplication>
#include <QDebug>

class Child: public QObject
{
public:

Child(QObject *parent = 0) : QObject(parent)
{}

~Child()
{
qDebug("child destroyed");
}
};

class Parent: public QObject
{
public:

Parent(QObject *parent = 0) : QObject(parent)
{}

~Parent()
{
qDebug("do something here");
qDebug("parent destroyed");
}
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

Parent *parent = new Parent;

Child *child1 = new Child(parent);
Child *child2 = new Child(parent);
//do something
delete parent;

return a.exec();
}

输出:

do something here
parent destroyed
child destroyed
child destroyed

如果你会写 ~Parent(){delete A; delete B;},然后正如您从输出中看到的那样,AB 将首先被删除,子对象将被更早地删除。

为什么?

Because of rule which I suggested you earlier

Inside Base constructor
Inside Derived constructor
Inside Derived destructor
Inside Base destructor

在我们的例子中翻译成:

Inside QObject constructor
Inside Parent constructor
Inside Parent destructor
Inside QObject destructor//don't forget that only ~QObject delete children, not a ~Parent

关于c++ - Qt:解构期间的子QObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28738810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com