c++代码模拟实现qt对象树机制


在qt中当父对象被销毁时,它会自动销毁所有子对象。这种机制使得内存管理更加方便不需要手动释放子对象内存。下面我将用代码简单模拟一下对象树的原理。


下面我们先来看一段日常可能发生的内存泄露的cpp代码:

namespace my
{class B{public:B() { a = 1; };int a;~B() { std::cout << "~B()" << std::endl; }};class A{public:A(){pB = new B();std::cout << "A()" << std::endl;}//~A() { delete pB; }忘记deleteB* pB;};
}my::A A1 = my::A();//创建一个A对象

我们发现此时在A对象中new出来的B对象并没有被释放,导致内存泄漏了。

下面我将对刚才的代码进行一部分的修改

namespace my
{class myobject//创建一个基类{public:myobject() { std::cout << "myobject()" << std::endl; }virtual ~myobject()//注意这是虚函数{std::cout << this << "地址下的_tree正在释放其内容" << std::endl;for (auto& tree : _tree) { delete tree; }}void setparent(myobject* parent = nullptr) { parent->_tree.push_back(this); }private:std::vector<myobject*> _tree;};class B:public myobject//继承一下父对象{public:B() { std::cout << "B("<<this<<")" << std::endl, a = 1; };int a;~B() { std::cout << "~B()" << std::endl; }};class A:public myobject{public:A(){pB = new B();pB->setparent(this);std::cout << "A(" <<this<<")" << std::endl;}~A() { std::cout<<"~A()"<<std::endl; }//忘记deleteB* pB;};
}my::myobject object = my::myobject();my::A* A1 = new my::A();A1->setparent(&object);std::cout << "---------------------------------" << std::endl;

我把A对象挂在了object对象B对象又挂在了A对象上,这样便形成了一颗简单的对象树。

效果如下:

object对象最先调用析构函数,遍历其容器,deleteA对象然后A对象调用其析构函数,遍历到B对象然后B对象调用其析构函数无对象在其容器自此所有对象全部被释放。

注意:虽然A对象先调用析构函数但是实际上A对象要等到B对象的生命周期结束之后A对象的生命周期才算结束。这个释放过程有点类似于函数递归。

如果文章有任何问题欢迎评论区讨论(我是在VS上一步步调试得来的结论)~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/325777.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习记录——삼십오 传输层UDP协议

文章目录 1、端口号2、UDP协议 信息加上应用层报头后&#xff0c;下一步发送到传输层 1、端口号 端口号标识了一个主机上进行通信的唯一一个应用程序。 在TCP/IP协议中&#xff0c;通过源IP&#xff0c;源端口号&#xff0c;目的IP&#xff0c;目的端口号&#xff0c;协议号来…

智慧旅游景区解决方案:PPT全文49页,附下载

关键词&#xff1a;智慧景区建设&#xff0c;智慧旅游平台&#xff0c;智慧旅游运营检测系统项目&#xff0c;智慧文旅&#xff0c;智慧景区开发与管理&#xff0c;智慧景区建设核心&#xff0c;智慧景区开发与管理 一、智慧景区建设现状 1、基础设施建设&#xff1a;智慧景区…

VMware ESXI 8 安装ipmitool 调整戴尔服务器风扇转速

本文内容适合ESXI 8版本安装ipmitool &#xff0c;进行管理&#xff0c;已知的是8.0以上版本无法安装社区的vib.所以需要自己编译文件&#xff0c;7.0及之前的版本可以安装vib版本的ipmtools。 一、编译好的适用于esxi8的ipmitool下载 ipmitool下载 二、安装ipmitool 1、开…

【深度学习】cv领域中各种loss损失介绍

文章目录 前言一、均方误差二、交叉熵损失三、二元交叉熵损失四、Smooth L1 Loss五、IOU系列的loss 前言 损失函数是度量模型的预测输出与真实标签之间的差异或误差&#xff0c;在深度学习算法中起着重要作用。具体作用&#xff1a; 1、目标优化&#xff1a;损失函数是优化算法…

第7章-第1节-Java中的异常处理

1、异常Exception概述&#xff1a; 1&#xff09;、异常的概念&#xff1a; 现实生活中万物在发展和变化会出现各种各样不正常的现象。 例如&#xff1a;人的成长过程中会生病。 实际工作中&#xff0c;遇到的情况不可能是非常完美的。 比如&#xff1a;你写的某个模块&…

三、C语言分支与循环知识点补充——随机数生成

本章分支结构的学习内容如下&#xff1a; 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句&#xff08;4&#xff09;分支结构 完 本章循环结构的…

Pytest——Fixture夹具的使用

一、什么是Fixture 在测试开展的过程中&#xff0c;会需要考虑到测试前的准备工作&#xff0c;以及测试后的释放操作行为。这些在Pytest中&#xff0c;会通过Fixture的方式来实现。如果说在运行pytest的测试用例的时候&#xff0c;需要调用一些数据来实现测试行为&#xff0c;…

不同版本opencvsharp的依赖

结合Github和NuGet查看 Github主页 OpenCvSharp-AnyCPU&#xff08;lastest Version 2.4.10.20170306&#xff09; VC2013 runtime Framework OpenCvSharp3-AnyCPU&#xff08;lastest Version 4.0.0.20181129&#xff09; VC2015 runtime Framework OpenCvSharp4 (lastest…

Mnist手写体数字数据集介绍与在Pytorch中使用

1.介绍 MNIST&#xff08;Modified National Institute of Standards and Technology&#xff09;数据集是一个广泛用于机器学习和计算机视觉研究的常用数据集之一。它由手写数字图像组成&#xff0c;包括0到9的数字&#xff0c;每张图像都是28x28像素的灰度图像&#xff0c;图…

Oracle文件自动“减肥”记

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

vite + vue3引入ant design vue 报错

npm install ant-design-vue --save下载插件并在main.ts 全局引入 报错 解决办法一&#xff1a; main.ts注释掉全局引入 模块按需引入 解决办法二 将package.json中的ant-design-vue的版本^4.0.0-rc.4改为 ^3.2.15版本 同时将将package-lock.json中的ant-design-vue的版本…

stable diffusion 人物高级提示词(二)衣物、身材

一、衣服大类 英文中文Shirt衬衫Blouse女式衬衫Dress连衣裙Skirt裙子Pants裤子Jeans牛仔裤Swimsuit泳衣Underwear内衣Bra文胸Panties内裤Stockings长筒袜Shoes鞋子Socks袜子 二、细分分类 dress 是连衣裙&#xff1a; 英文解释Formal Dress正式礼服&#xff0c;通常用于正式…