Qt中的对象树
一. QT对象树的概念
QObject 的构造函数中会传入一个 Parent 父对象指针,children() 函数返回 QObjectList。即每一个 QObject 对象有且仅有一个父对象,但可以有很多个子对象。
那么Qt这样设计的好处是什么呢?很简单,就是为了方便内存管理。在创建QObject对象时,可以提供一个父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表,当父对象析构的时候,这个列表的所有对象也会被析构。当析构子对象的时候,会自动从父对象的子对象列表中删除。
当一个Q0bject对象在堆上创建的时候,Qt会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。任何对象树中的Q0bject对象delete的时候,如果这个对象有 parent,则自动将其从parent的children()列表中删除;如果有孩子,则自动delete 每一个孩子。Qt 保证没有 Q0bject 会被 delete 两次,这是由析构顺序决定的。
如果 Q0bject 在栈上创建,Qt 保持同样的行为。正常情况下,这也不会发生什么问题。来看下下面的代码片段:
{QWidget window;QPushButton quit("Quit",&window);
}
作为父组件的 window 和作为子组件的 quit 都是 Q0bject 的子类(事实上,它们都是 QWidget 的子类,而 QWidget是Q0bject 的子类)。这段代码是正确的,quit 的析构函数不会被调用两次,因为标准 C++要求,局部对象的析构顺序应该按照其创建顺序的相反过程。因此,这段代码在超出作用域时,会先调用 quit的析构函数,将其从父对象window的子对象列表中删除,然后才会再调用window 的析构函数。
二. 使用纯C++实现QT对象树内存回收机制底层原理
#include <iostream>
#include <list>
using namespace std;
class Object;
typedef list<Object*> ObjectList;class Object
{
public:ObjectList children_List;Object(Object* parent = nullptr){if(parent != nullptr){parent->children_List.push_back(this);}}//为了保证使用多态时,子类对象无法释放的问题,所以加一个virtualvirtual ~Object(){for(auto it = children_List.begin(); it != children_List.end(); it++){delete *(it);}}
};class A : public Object
{
public:A(Object* parent = nullptr){if(parent != nullptr){parent->children_List.push_back(this);}cout<<"A gouzao"<<endl;}~A(){cout<<"A xigou"<<endl;}
};class B : public Object
{
public:B(Object* parent = nullptr){if(parent != nullptr){parent->children_List.push_back(this);}cout<<"B gouzao"<<endl;}~B(){cout<<"B xigou"<<endl;}
};int main()
{
// Object obj;
// A* a = new A(&obj);B b;A* a = new A(&b);//new A是一个继承的子类对象 b父类的指针 也就是b的孩子列表中装入了A这个对象 B和A不是继承关系,//不需要指针,也不需要delete,内存就能被完整的释放掉return 0;
}
virtual 为了保证使用多态时,子类对象无法释放的问题,所以加一个virtual
auto 是自动类型判断
相关文章:
Qt中的对象树
一. QT对象树的概念 QObject 的构造函数中会传入一个 Parent 父对象指针,children() 函数返回 QObjectList。即每一个 QObject 对象有且仅有一个父对象,但可以有很多个子对象。 那么Qt这样设计的好处是什么呢?很简单,就是为了方…...
QT-day1
1、 自由发挥应用场景,实现登录界面。 要求:尽量每行代码都有注释。 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QIcon>//窗口 #include <QLabel>//标签库 #include <QMovie>//动态图片库 #include…...
安装oh-my-zsh(命令行工具)
文章目录 一、安装zsh、git、wget二、安装运行脚本1、curl/wget下载2、手动下载 三、切换主题1、编辑配置文件2、切换主题 四、安装插件1、zsh-syntax-highlighting(高亮语法错误)2、zsh-autosuggestions(自动补全) 五、更多优化配…...
解决方案:‘Series‘ object has no attribute ‘xxxx‘
文章目录 一、现象二、解决方案 一、现象 ...... model.fit(X_train, y_train) y_pred model.predict(X_test) recall recall_score(y_test, y_pred) precision precision_score(y_test. y_pred) ......执行语句到**“precision precision_score(y_test. y_pred)”**这里发…...
智慧手术室手麻系统源码,C#手术麻醉临床信息系统源码,符合三级甲等医院评审要求
手麻系统全套源码,C#手术麻醉系统源码,支持二次开发,授权后可商用。 手术麻醉临床信息系统功能符合三级甲等医院评审要求,实现与医院现有信息系统如HIS、LIS、PACS、EMR等系统全面对接,全面覆盖从患者入院,…...
项目公共组件代码
弹出框标题 <Textstyle{{marginTop: 20,marginBottom: 5,fontSize: 20,textAlign: center,fontWeight: bold,color: black,}}>{data.language.CROUPLIST_CLASS_MEMBERS}</Text>可以复用的公共体 import React, {useContext, useEffect, useState} from react; imp…...
深入解析MySQL中的事务(上)
MySQL事务管理 一、事务的基本概念为什么需要事务?1. 数据完整性2. 并发控制3. 错误恢复4. 复杂业务逻辑的支持5. 安全性 为什么会出现事务查看引擎是否支持事务事务提交方式自动提交(Automatic Commit)手动提交(Manual Commit&am…...
Springboot项目使用redis实现session共享
1.安装redis,并配置密码 这里就不针对于redis的安装约配置进行说明了,直接在项目中使用。 redis在windows环境下安装:Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)_redis安装-CSDN博客 2…...
【Linux】Centos7安装部署unimrcp,搭建MRCP服务器
yum install libtool yum install libtool-ltdl-devel yum install libsofia-sip-ua find / -name libsofia-sip-ua.so.0 2>/dev/null # 设置环境变量:如果库文件存在但不在默认搜索路径中,你可以通过设置 LD_LIBRARY_PATH 环境变量来告诉系统在哪…...
什么是Jetpack
Jetpack Jetpack 是一套组件库、工具,可帮助开发人员遵循最佳做法,减少样板代码并编写可在 Android 版本和设备上一致工作的代码,以便开发人员可以专注于他们关心的代码 组成 主要包含四部分:架构(Architecture&…...
macOS sonoma 14.4.1编译JDK 12
macOS sonoma 14.4.1编译JDK 12 环境参考文档开始简述问题心路历程着手解决最终解决(前面有点啰嗦了,可以直接看这里) 记录一次靠自己看代码解决问题的经历(总之就是非常开心)。 首先,先diss一下bing,我差一点就放弃了。 环境 macOS sonom…...
GPU通用计算介绍
谈到 GPU (Graphics Processing Unit,图形显示卡)大多数人想到的是游戏、图形渲染等这些词汇,图形处理确实是 GPU 的一大应用场景。然而人们也早已关注到它在通用计算上的巨大潜力,并提出了 GPGPU (General-purpose co…...
如果数据给的是树形 转好的树形结构并且是有两个二级children的话 该如何写?
第一我们要自己写一个children 并且张数据里面的所要渲染的二级进行赋值 赋给我们新建的children 以下是代码转树形赋值 organ().then(function (res) {console.log(res); // 成功回调// setLists(res.data.data)res.data.data res.data.data.map((obj) > ({...obj, // …...
C++ 函数重载
两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器会根据实参的类型机个数的最佳来自动调用哪一个函数。 一 带默认形参值的函数 在定义函数时预先声明默认的形参值。调用时如果给出实参,则用实参初始化形…...
5. 分布式链路追踪TracingFilter改造增强设计
前言 在4. 分布式链路追踪客户端工具包Starter设计一文中,我们实现了基础的Starter包,里面提供了我们自己定义的Servlet过滤器和RestTemplate拦截器,其中Servlet过滤器叫做HoneyTracingFilter,仅提供了提取SpanContext࿰…...
C++数据类型与表达式
一 C中的数据类型 二 基本数据类型 三 类型转换 各种类型的高低顺序如下所述; 四 构造数据类型 类类型...
电脑ip地址设置成什么比较好
随着信息技术的快速发展,IP地址已成为电脑在网络世界中的“身份证”。它不仅是电脑在网络中进行通信的基础,也直接关系到网络连接的稳定性、安全性和效率。然而,面对众多IP地址设置选项,许多用户可能会感到困惑。那么,…...
vue-element-template优化升级dart-sass、pnpm
1、替换 node-sass 为 dart-sass - "node-sass": "^4.9.0","sass": "^1.75.0",替换css深度作用域写法 /deep/ >>># 替换为::v-deepVue:Node Sass VS. Dart Sass 2、替换npm为pnpm,需要补充一些依赖…...
Oracle拼接json字符串
在Oracle数据库中,并没有内建的JSON处理函数像其他现代数据库那样直接。但是,你可以使用字符串连接和格式化技巧来拼接JSON字符串。 以下是一个简单的例子,说明如何在Oracle中拼接一个JSON字符串: sql DECLARE v_json_string V…...
如何向Linux内核提交开源补丁?
2021年,我曾经在openEuler社区上看到一项改进Linux内核工具的需求,因此参与过Linux内核社区的开源贡献。贡献开源社区的流程都可以在内核社区文档中找到,但是,单独学习需要一个较长的过程,新手难以入门,因此…...
UniApp真机调试支付宝扫码,从‘报错’到‘跑通’的完整避坑指南
UniApp真机调试支付宝扫码:从报错到流畅运行的实战指南 第一次在UniApp中集成支付宝原生扫码功能时,我遇到了一个令人抓狂的问题——明明在模拟器上运行得好好的,一到真机调试就各种报错。经过反复尝试和查阅文档,终于找到了问题的…...
三电平 VSG 构网型变流器仿真分析
三电平 VSG 构网型变流器仿真 仿真使用双闭环控制,svpwm 调制 [1]包含 LC 滤波器 [2]包含中点电位平衡控制 [3]包含负荷投切与离网切换 基本工况:0—3s 功率指令 170kw3-6s 功率指令 140kw电网频率在 1-2s 暂降 0.2hz,vsg 通过 增发有功维持…...
AI辅助数据库设计:让快马平台智能生成优化过的社区论坛系统数据架构
今天想和大家分享一个用AI辅助设计数据库的实践案例——社区论坛系统的数据架构设计。整个过程在InsCode(快马)平台上完成,体验非常流畅。 业务场景分析 社区论坛的核心是内容交互,需要支持用户发帖、互动和管理。通过AI分析,我们确定了几个关…...
风电调频翻车实录:当虚拟惯性遇上二次跌落
双馈风力电机虚拟惯性控制下垂控制三机九节点一次调频模型 [1]系统为三机九节点模型,所有参数已调好且可调,可直接运行,风电渗透率19.4% [2]风机采用虚拟惯性下垂控制,转速回复模块,在系统频率跌落时释放转子动能提供有…...
计算机毕业设计269—基于python+深度学习+YOLOV8的交通标志识别系统(源代码+数据库+报告)
毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于python深度学习YOLOV8的交通标志识别系统(源代码数据库报告)269 一、系统介绍 1、用户: 在界面中选择各种图片,可以是自己在路边拍摄的图片࿰…...
终极指南:如何利用Everything-LLMs-And-Robotics快速掌握AI机器人核心技术
终极指南:如何利用Everything-LLMs-And-Robotics快速掌握AI机器人核心技术 【免费下载链接】Everything-LLMs-And-Robotics 项目地址: https://gitcode.com/gh_mirrors/ev/Everything-LLMs-And-Robotics 在人工智能与机器人技术融合的浪潮中,你是…...
透视表vs交叉表:用餐厅小费数据掌握Pandas两大分析利器
透视表vs交叉表:用餐厅小费数据掌握Pandas两大分析利器 在数据分析的日常工作中,我们经常需要对数据进行多维度的交叉分析。想象一下这样的场景:你手里有一家连锁餐厅过去三个月的小费数据,老板想知道不同时间段(午餐/…...
终极指南:如何使用Scan4all识别和规避蜜罐陷阱的完整教程
终极指南:如何使用Scan4all识别和规避蜜罐陷阱的完整教程 【免费下载链接】scan4all 项目地址: https://gitcode.com/gh_mirrors/sc/scan4all 蜜罐作为网络安全领域的重要防御手段,常被用来诱捕攻击者并收集威胁情报。对于安全测试人员和渗透测试…...
如何快速搭建Sub-Web:Vue前端配置生成器完整指南
如何快速搭建Sub-Web:Vue前端配置生成器完整指南 【免费下载链接】sub-web 项目地址: https://gitcode.com/gh_mirrors/su/sub-web Sub-Web是基于Vue.js 2.6与subconverter后端实现的订阅配置自动生成Web界面,提供简洁美观的前端界面,…...
AnimateDiff开源贡献:PyTorch核心代码解读与修改
AnimateDiff开源贡献:PyTorch核心代码解读与修改 1. 引言 如果你对AI视频生成感兴趣,可能已经听说过AnimateDiff这个强大的文生视频框架。它能够将静态的文字描述转化为生动的视频内容,效果相当惊艳。但你是否想过,这个看似神秘…...
