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的函数,会对字符编码集进行处理。

运行结果:

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

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

这更加验证前面的话。

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

相关推荐
solomonzw1 小时前
C++ 学习(八)(模板,可变参数模板,模板专业化(完整模板专业化,部分模板专业化),类型 Traits,SFINAE(替换失败不是错误),)
c语言·开发语言·c++·学习
程序员JerrySUN1 小时前
在 Ubuntu 20.04 上交叉编译 Qt 5 应用,使其可在 Windows 运行
windows·qt·ubuntu
阳洞洞1 小时前
“nullptr“ should be used to denote the null pointer
开发语言·c++
攻城狮7号1 小时前
【第15节】C++设计模式(行为模式)-State(状态)模式
c++·设计模式·状态模式
Alfred young2 小时前
CS144 Lab Checkpoint 0: networking warm up
c++·网络协议
JuicyActiveGilbert3 小时前
【C++设计模式】第五篇:原型模式(Prototype)
c++·设计模式·原型模式
我的电脑会说烫3 小时前
线程池项目优化
c++
想你依然心痛3 小时前
侯捷 C++ 课程学习笔记:深入理解智能指针
c++·笔记·学习
Erik_LinX3 小时前
算法日记33:14届蓝桥C++B冶炼金属(二分答案)
开发语言·c++·算法
张二娃同学4 小时前
数据结构篇—队列(queue)
数据结构·c++