6-Qt6对象树及内存管理
生活随笔
收集整理的這篇文章主要介紹了
6-Qt6对象树及内存管理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
把類的對象組織成樹形結構,這種樹形結構也稱為對象樹,Qt 使用對象樹來管理 QObject 及其子類的對象。
重要:當父對象析構的時候,這個列表中的所有對象也會被自動逐級析構。
?如下圖樹形,當Parent析構時,第二層,第三層,第四層,第五層,都會被自動析構,開發者不需要delete等任何操作,回收內存的管理是自動的。
當你創建一個QObject對象時,會看到QObject的構造函數接收一個QObject指針作為參數,這個參數就是 parent,也就是父對象指針。這相當于,在創建QObject對象時,可以提供一個其父對象,我們創建的這個QObject對象會自動添加到其父對象的children()列表。
這也就是為什么在Qt中經常只看到new操作而看不到delete操作的原因!前提是它和Object或者它的子類有關系,否則按c++原則new后不delete就造成內存泄露!
以下演示:兩種情況? getTest()有paren、getTest2()無parent
1、有parent情況;
可以看出,子類最后被析構回收。
2、無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.h #ifndef TEST_H #define TEST_H#include <QObject> #include <QDebug>class Test : public QObject {Q_OBJECT public:explicit Test(QObject *parent = nullptr);~Test(); signals:};#endif // TEST_H //test.cpp #include "test.h"Test::Test(QObject *parent) : QObject(parent) {qInfo() << this << "Constructed" << parent; }Test::~Test() {qInfo() << this << "Deconstructed" << parent(); } 與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的6-Qt6对象树及内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5-Qt6 QObjec对象拷贝
- 下一篇: 7-Qt6 qDeleteAll内存管理