QT——对象树

在上一篇博客我们已经学会了QT的坏境安装以及打印一个hello world,但是如果有细心的朋友看了代码,就会发现有一个严重的问题,从C++语法看来存在内存泄漏。

上面的代码实际上并没有发送内存泄漏,是不是觉得有点奇怪?大家有没有发现上面的new代码里面传了参数,这是将this对象也就是parent与QLabel对象建立了父子关系,parent对象会将挂靠在parent里面利用类似于树形结构进行管理,里面有一个列表存储了挂靠在parent下的子对象,在parent对象释放的适合会将子对象也释放掉,为什么我们不手动释放呢?有两个原因

1,防止粗心大意导致内存泄漏(作用类似于C++智能指针)

2,代码一下就运行结束了,我们的窗口布局如果自己释放内容也一下子就结束了,利用对象树就可以在窗口关闭的合适时机释放,看接下来的代码和运行图。

注:挂到对象树上面就不要手动释放哦,可能导致资源重复释放和破坏对象树。

注意:挂的是空指针,不然可能重复释放资源和破坏对象树哦。

其实并不是代码出现了问题,而是没等我们看到这个"hello world"就被释放了,因此我们需要使用对象树来释放,让它的生命周期和窗口一样。

我们可以通过对QLable封装一下看到这个现状,下面是封装代码

注:为什么要用QDebug,因为使用C++的cout编码会和qt的编码冲突,打印乱码,而QDebug是qt的函数,会对字符编码集进行处理。

运行结果:

我们可以看到析构函数没有打印,代表还没有执行,那我们叉掉窗口试试

这就代表子对象析构是和父对象一起析构的,而且是窗口关闭后析构的,如果我们自己手动释放会怎么样呢?

这更加验证前面的话。

欧克,今天就到这里,如果有所收获的话记得点赞收藏哦。

相关推荐
悄悄敲敲敲1 小时前
C++第14届蓝桥杯b组学习笔记
c++·学习·算法·蓝桥杯
努力学习的小廉1 小时前
【C++11(下)】—— 我与C++的不解之缘(三十二)
开发语言·c++
Hello.Reader2 小时前
迭代器介绍与使用(四十一)
开发语言·c++
永不停转2 小时前
从源码解析 QGraphicsItem 旋转、缩放、平移、transform等变换操作,利用QGraphicsTransform实现变形动画
c++·qt
Ethon_王3 小时前
STL基础&string容器
c++
共享家95273 小时前
深入探究C++ 运算符重载:以日期类为例
c++
老歌老听老掉牙4 小时前
C++使用Qt Charts创建数据可视化图表
c++·qt·信息可视化
爽帅_4 小时前
【C++】STL库_stack_queue 的模拟实现
开发语言·c++
。。。9045 小时前
C++中,应尽可能将引用形参声明为const
开发语言·c++
云边有个稻草人5 小时前
【C++】第九节—string类(中)——详解+代码示例
开发语言·c++·迭代器·string类·string的常用接口·string的模拟实现·string的经典例题