您现在的位置是:首页 > 正文

【Qt】为什么Qt会使用堆对象(指针)而不是栈对象?

2024-02-01 05:25:35阅读 2

博主个人站点: https://azmddy.top
原文链接:为什么Qt会使用堆对象(指针)而不是栈对象?
文中存在图片,如遇到无法查看图片,请点击原文链接阅读。
以下正文:


为什么Qt会使用堆对象(指针)而不是栈对象?

对于C++开发者来说,对象的生命周期和内存管理都是需要特别关注的,Qt为什么new了对象,却不需要我们delete?会不会内存泄露?心中总有一种不安。

首先需要区分new了什么,如果是Qt的对象,需要将对象关联到父对象。这是由于Qt的内存管理机制:当父对象在销毁时会自动删除子对象,Qt内存管理使用于对象的层次结构。如果不是Qt的对象,就需要自己关注对象的生命周期和内存管理了。

QWidget* w = new QWidget();
QPushButton* pushBtn = new QPushButton(w);
delete w;

对于这段代码,我们首先创建了一个QWidget对象,由于没有指定它的父对象,所以它的内存需要我们自己管理,QPushButton对象创建时关联了父对象w,在析构w时,会先析构掉pushBtn

我们可以看一下源码:

因为继承的原因我们直接看QObject这个类就好了。

image-20220306155226591

如果我们创建对象的时候指定了父对象,就会被加到children这个QObjectList中。setParent函数也是一样的作用。也就是只要是继承了QObject,不论是直接继承还是间接继承,都可以利用qt的这套内存管理方式。

我们再看一下析构函数:

函数有点长,只截取我们关注的部分。

image-20220306155753793

在这里可以发现析构的是会调用deleteChildren去删除子对象。

image-20220306160000103

这个函数就在删除对象的子对象。

到这里就很清晰明了了。

参考:

网站文章

  • 九九乘法表的不同类型

    左下三角九九乘法表 for row in range(1,10): for col in range(1,row+1): print("{0}*{1}={2:2d}".format...

    2024-02-01 05:25:30
  • 定点数和浮点数(一)

    定点数和浮点数(一)

    计算机中的【带小数】

    2024-02-01 05:25:22
  • 深度学习中的batch的大小对学习效果有何影响?

    推荐阅读:[1] 深度学习中的batch的大小对学习效果有何影响? - 言有三的回答 - 知乎[2] 深度学习中的batch的大小对学习效果有何影响? - 程引的回答 - 知乎[3] batch si...

    2024-02-01 05:24:54
  • js 数字加减乘除精度问题,解决小数点后多位小数

    在javascript中,当你使用小数进行加减乘除运算时,你会发现,所得到的结果有时后面带有长长的一段小数,使运算变得复杂,并且影响计算结果。上网查询了一下原因,大致如下:在javascript中,带...

    2024-02-01 05:24:49
  • php+websocket实现在线聊天室(一)

    php+websocket实现在线聊天室(一)

    聊天室最终实现版:https://www.sinight.site/chatroom 可以自己多开几个窗口体验 前言:WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。 浏览器通过 Java...

    2024-02-01 05:24:42
  • Mac上安装Grafana

    Mac上安装Grafana

    Mac上安装Grafana一、背景二、安装步骤1、通过 Home Brew 安装2、通过二进制包进行安装1、下载2、grafana配置文件的路径3、修改grafana配置1、修改默认的3000端口2、...

    2024-02-01 05:24:14
  • Table列表筛选结果保持不变

    Table列表筛选结果保持不变,详解React中setState回调函数

    2024-02-01 05:24:07
  • centos和Ubuntu在线安装docker、docker-compose

    centos和Ubuntu在线安装docker、docker-compose

    然后设置全局Docker容器日志大小,并修改docker的存储目录,在/etc/docker目录创建daemon.json文件,然后写入以下内容,最后重启docker和系统加载文件。然后设置全局Doc...

    2024-02-01 05:24:01
  • Java制作简单的单选和多选测试题

    Java制作简单的单选和多选测试题 题目: 定义考题类(Question)及其子类 完成考题类(Question),单选题(SingleChoice)和多选题(MultiChoice)是其子类 要求:...

    2024-02-01 05:23:31
  • pmm最新版本v2.40.0尝鲜体验

    pmm最新版本v2.40.0尝鲜体验

    让DBA快速初窥pmm v2.40.0

    2024-02-01 05:23:24