1. 父子对象机制(QObject派生类)
Qt中最核心的内存管理方式是通过QObject的父子关系:
-
自动删除:当父对象被删除时,会自动删除其所有子对象
-
对象树结构:QObject及其派生类构成对象树
-
设置父对象:
2. 智能指针
Qt提供了几种智能指针来帮助管理内存:
-
QSharedPointer:引用计数智能指针
-
QWeakPointer:与QSharedPointer配合使用,避免循环引用
-
QScopedPointer:作用域指针,离开作用域自动删除
-
QPointer:对QObject的弱引用,当对象被删除时自动置null
3. 容器类的内存管理
Qt容器类如QList、QVector等会自动管理其元素的内存:
-
当容器被销毁时,会自动销毁其中的元素
-
对于指针元素,需要手动删除或使用智能指针
4. 显式内存管理
-
delete:可以显式删除对象
-
deleteLater():安全删除方法,将删除操作放入事件循环
Qt 父子对象机制
Qt 的父子对象机制是 Qt 内存管理的核心特性,主要基于 QObject 类及其派生类。这一机制通过对象树(Object Tree)自动管理对象的生命周期,显著简化了内存管理。
1. 基本原理
父对象拥有子对象:当父对象被销毁时,会自动销毁其所有子对象
对象树结构:所有 QObject 及其派生类对象可以形成树状层次结构
自动内存管理:无需手动删除子对象(除非需要提前释放)
2. 设置父子关系的方式
(1) 构造函数指定父对象
QWidget *window = new QWidget; // 父对象(顶级窗口)
QPushButton *button = new QPushButton("Click", window); // 子对象
(2) 使用 setParent() 方法
QPushButton *button = new QPushButton("Click");
button->setParent(window); // 设置父对象
(3) 添加子对象到父对象的布局
QHBoxLayout *layout = new QHBoxLayout(window);
QPushButton *button = new QPushButton("OK");
layout->addWidget(button); // 自动建立父子关系