【内存管理】对象树(内存管理)
一、前言
我们常常听到 QObject 会用对象树来组织管理自己,那什么是对象树?这个概念非常好理解。因为 QObject 类就有一个私有变量 QList<QObject *>,专门存储这个类的子孙后代们。比如创建一个 QObject 并指定父对象时,就会把自己加入到父对象的 children() 列表中,也就是 QList<QObject *> 变量中。
在QT中使用对象树来管理 QObject 及其子类的对象。当父对象析构的时候,QList<QObject *>这个列表中的所有对象也会被自动逐级析构。
二、演示实例
2.1、[getTest()有paren] VS [getTest2()无parent]
include <QCoreApplication>
#include <QTimer>
#include "test.h"Test* getTest(QObject* parent){return new Test(parent);
}
Test* getTest2(){return new Test(); //No parent
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QTimer timer;timer.singleShot(3000,&a,&QCoreApplication::quit);Test* dog = getTest(&a); // 有父亲dog->setObjectName("BaGong");Test* cat = getTest2(); // 无父亲cat->setObjectName("Kitty");cat->setParent(dog);int value = a.exec();qInfo() << "Exit code:" << value;return value;
}//test.cpp
#include "test.h"Test::Test(QObject *parent) : QObject(parent){qInfo() << this << "Constructed" << parent;
}
Test::~Test(){qInfo() << this << "Deconstructed" << parent();
}
可以看出,子类最后被析构回收。
可以看到有构造函数,但却无析构函数执行。