关于Qt的内存管理机制

本文探讨了Qt的内存管理机制,指出其与智能指针的相似之处在于对象由其父部件管理,避免了手动delete。当创建QWidgets对象时,通过传递父部件指针,对象会自动随着父部件的生命周期进行显示和释放。这一机制基于QObject的内存管理,确保了对象在适当的时候被销毁,防止内存泄漏。作者还提出了自定义内存管理的实现思路,即创建一个基类来管理一系列对象。
摘要由CSDN通过智能技术生成

提示:在查看Qt代码时,发现许多对象通过new的方式创建后,没有通过delete释放,让我产生疑问,是否会产生内存泄漏。

文章目录


前言

Qt的内存管理机制,和智能指针不能说一模一样,只能说是完全相同。智能指针是我管理它,Qt的内存管理机制是它管理我。也就是智能指针反过来用。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Qt内存管理机制的发现:

我们在通过鼠标操作自己添加按钮在界面内时,一切正常:

 那么是否可以自己通过模仿ui.h文件的写法,通过代码完成对按钮的放置呢?

 

 这就是通过通过复制ui.h文件得到的代码,运行后发现没有出现按钮,需要调用show函数才可以显示,并且是以新窗口的形式出现的。这时候就出现了一个问题,为什么源代码没有show函数就可以显示,我没有show就不能显示,而且为什么会以新窗口的形式出现。

通过对比发现,我缩写的代码,在new时和源代码出现了差异。

pushButton_nextsong = new QPushButton(centralWidget);
pushButton_nextsong->setObjectName(QStringLiteral("pushButton_nextsong"));

它传了个参数。这就是为什么它不需要delete也不会内存泄漏的原因,这就是为什么它的按钮不会以新窗口出现的原因。

二、Qt内存管理机制的原理:

通过帮助手册查看一下Qpushbutton的构造函数

会发现它的构造函数有个参数,是个QWidget类型的指针,默认值为NULL。

我们再查看QpushButton的继承关系,不难发现它继承了QAbstractButton,QAbstractButton又继承了QWidget,QWidget又继承了QObject。也就是说参数可以传一个父部件的指针或者说对象(不一定是继承关系)。这就是内存管理机制的核心。

 我们通过帮助手册,查看其父部件QWidget的构造函数,发现了内存管理机制的秘密:

 所以通俗的来说,就是给当前对象找了爹管理它,那么这个对象就会成为父部件的子部件,随着父部件出现而出现,父部件的关闭而关闭,而不需要单独delete。

总结:

内存管理和展示是不同的类去做的,展示是QWidget界面类去做,但是内存管理是QObject去完成的(Qt特有的类百分之90都继承了QObject)。所以说传参所传的父部件这个类不是随便传的,必须继承QObject这个类的才行。所以说展示的show和回收资源的delete是不同的类去完成的。

之所以说和智能指针一样,是因为在这里,我是将自己给到了QObject,那么QObject中有了我,在析构时就释放了我,所以是它管我。智能指针是我管他,创建在栈区,程序结束自动释放也是可以完成内存管理的。



这是后期添加:如何自己实现内存管理的功能。

Qt的内存管理是已经写好的框架,那么如何自己去写一段代码完成内存管理机制呢?

只需要自己写一个类(举个例子就叫它MyObject),所有需要进行内存管理的类继承自己写的MyObjiect。MyObject的实现我用代码说明

class MyObject
{
    MyObject(MyObject *pr=NULL)
    {
        if(pr != NULL && !isOK)
        {
            pr->IO.insert(this);//传入需要被管理的指针,将其放到容器里去
            isOK = true;//这个标志位是为了防止被重复管理
        }
    }

    ~MyObject()
    {
        if(isOK)
        delete List;//这个写法不正确,只是为了理解,析构时释放掉容器内对应的指针指向的堆区空间
    }
private:
    List<MyObject *> IO;//通过容器存储需要管理的指针
    bool isOK;
};

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值