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

运行结果:

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

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

这更加验证前面的话。

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

相关推荐
山野万里__12 分钟前
C++与Java内存共享技术:跨平台与跨语言实现指南
android·java·c++·笔记
Mr_Xuhhh1 小时前
网络基础(1)
c语言·开发语言·网络·c++·qt·算法
醇醛酸醚酮酯2 小时前
std::promise和std::future的使用示例——单线程多链接、多线程单链接
网络·c++·算法
背影疾风2 小时前
C++之路:类基础、构造析构、拷贝构造函数
linux·开发语言·c++
程序员弘羽2 小时前
C++ 第四阶段 内存管理 - 第二节:避免内存泄漏的技巧
java·jvm·c++
DolphinDB4 小时前
如何在C++交易系统中集成高性能回测与模拟撮合
c++
feiyangqingyun4 小时前
Qt音视频开发技巧/推流带旋转角度/rtsprtmp推流/保存文件到MP4/拉流解析旋转角度
qt·音视频·qt旋转角度推流
筏.k4 小时前
C++ 网络编程(14) asio多线程模型IOThreadPool
网络·c++·架构
清醒的兰5 小时前
Qt 基于TCP套接字编程
网络·qt·tcp
爱喝茶的小茶5 小时前
周赛98补题
开发语言·c++·算法