Qt中内存回收

Qt中的对象是通过对象树组织的,QObject构造函数中的parent指针用于建立父子关系。当父对象析构时,其子对象也会被自动析构,解决了部分内存管理问题。QWidget作为窗口组件的基类,同样遵循此规则。在Qt中,要实现内存自动回收,创建的对象必须是QObject子类,并且使用堆内存分配。这样,通过对象树的结构,可以确保对象在适当的时候被删除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习来源:哔哩哔哩大学        UP主:爱编程的大丙

在 Qt 中创建对象的时候会提供一个 Parent对象指针(可以查看类的构造函数),下面来解释这个 parent 到底是干什么的。

QObject 是以对象树的形式组织起来的。当你创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。这相当于,在创建 QObject 对象时,可以提供一个其父对象,我们创建的这个 QObject 对象会自动添加到其父对象的 children () 列表。当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!

QWidget 是能够在屏幕上显示的一切组件的父类。QWidget 继承自 QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。因此,它会显示在父组件的坐标系统中,被父组件的边界剪裁。例如,当用户关闭一个对话框的时候,应用程序将其删除,那么,我们希望属于这个对话框的按钮、图标等应该一起被删除。事实就是如此,因为这些都是对话框的子组件。

Qt 引入对象树的概念,在一定程度上解决了内存问题。

(1)当一个 QObject 对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。

(2)任何对象树中的 QObject 对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的 children () 列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有 QObject 会被 delete 两次,这是由析构顺序决定的。


代码:

#include "subwindow.h"
#include "ui_subwindow.h"
#include "QDebug"

SubWindow::SubWindow(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::SubWindow)
{
    ui->setupUi(this);
}

SubWindow::~SubWindow()
{
    qDebug() <<"我是SubWindow,我被析构啦。。。。";
    delete ui;
}

 当他的父类的窗口被关闭后,他的内存也被析构。


总结

        综上所述,我们可以得到一个结论: Qt中有内存回收机制, 但是不是所有被new出的对象被自动回收, 满足条件才可以回收 , 如果想要在 Qt 中实现内存的自动回收,需要满足以下两个条件:

        创建的对象必须是 QObject 类的子类 (间接子类也可以)

        QObject 类是没有父类的,Qt 中有很大一部分类都是从这个类派生出去的

        Qt 中使用频率很高的窗口类和控件都是 QObject 的直接或间接的子类,其他的类可以自己查阅 Qt 帮助文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值