当前位置: 首页 > news >正文

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 父对象指针&#xff0c;children() 函数返回 QObjectList。即每一个 QObject 对象有且仅有一个父对象&#xff0c;但可以有很多个子对象。 那么Qt这样设计的好处是什么呢&#xff1f;很简单&#xff0c;就是为了方…...

QT-day1

1、 自由发挥应用场景&#xff0c;实现登录界面。 要求&#xff1a;尽量每行代码都有注释。 #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&#xff08;高亮语法错误&#xff09;2、zsh-autosuggestions&#xff08;自动补全&#xff09; 五、更多优化配…...

解决方案:‘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#手术麻醉临床信息系统源码,符合三级甲等医院评审要求

手麻系统全套源码&#xff0c;C#手术麻醉系统源码&#xff0c;支持二次开发&#xff0c;授权后可商用。 手术麻醉临床信息系统功能符合三级甲等医院评审要求&#xff0c;实现与医院现有信息系统如HIS、LIS、PACS、EMR等系统全面对接&#xff0c;全面覆盖从患者入院&#xff0c;…...

项目公共组件代码

弹出框标题 <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事务管理 一、事务的基本概念为什么需要事务&#xff1f;1. 数据完整性2. 并发控制3. 错误恢复4. 复杂业务逻辑的支持5. 安全性 为什么会出现事务查看引擎是否支持事务事务提交方式自动提交&#xff08;Automatic Commit&#xff09;手动提交&#xff08;Manual Commit&am…...

Springboot项目使用redis实现session共享

1.安装redis&#xff0c;并配置密码 这里就不针对于redis的安装约配置进行说明了&#xff0c;直接在项目中使用。 redis在windows环境下安装&#xff1a;Window下Redis的安装和部署详细图文教程&#xff08;Redis的安装和可视化工具的使用&#xff09;_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 # 设置环境变量&#xff1a;如果库文件存在但不在默认搜索路径中&#xff0c;你可以通过设置 LD_LIBRARY_PATH 环境变量来告诉系统在哪…...

什么是Jetpack

Jetpack Jetpack 是一套组件库、工具&#xff0c;可帮助开发人员遵循最佳做法&#xff0c;减少样板代码并编写可在 Android 版本和设备上一致工作的代码&#xff0c;以便开发人员可以专注于他们关心的代码 组成 主要包含四部分&#xff1a;架构&#xff08;Architecture&…...

macOS sonoma 14.4.1编译JDK 12

macOS sonoma 14.4.1编译JDK 12 环境参考文档开始简述问题心路历程着手解决最终解决(前面有点啰嗦了&#xff0c;可以直接看这里) 记录一次靠自己看代码解决问题的经历(总之就是非常开心)。 首先&#xff0c;先diss一下bing&#xff0c;我差一点就放弃了。 环境 macOS sonom…...

GPU通用计算介绍

谈到 GPU &#xff08;Graphics Processing Unit&#xff0c;图形显示卡&#xff09;大多数人想到的是游戏、图形渲染等这些词汇&#xff0c;图形处理确实是 GPU 的一大应用场景。然而人们也早已关注到它在通用计算上的巨大潜力&#xff0c;并提出了 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++ 函数重载

两个以上的函数&#xff0c;具有相同的函数名&#xff0c;但是形参的个数或者类型不同&#xff0c;编译器会根据实参的类型机个数的最佳来自动调用哪一个函数。 一 带默认形参值的函数 在定义函数时预先声明默认的形参值。调用时如果给出实参&#xff0c;则用实参初始化形…...

5. 分布式链路追踪TracingFilter改造增强设计

前言 在4. 分布式链路追踪客户端工具包Starter设计一文中&#xff0c;我们实现了基础的Starter包&#xff0c;里面提供了我们自己定义的Servlet过滤器和RestTemplate拦截器&#xff0c;其中Servlet过滤器叫做HoneyTracingFilter&#xff0c;仅提供了提取SpanContext&#xff0…...

C++数据类型与表达式

一 C中的数据类型 二 基本数据类型 三 类型转换 各种类型的高低顺序如下所述; 四 构造数据类型 类类型...

电脑ip地址设置成什么比较好

随着信息技术的快速发展&#xff0c;IP地址已成为电脑在网络世界中的“身份证”。它不仅是电脑在网络中进行通信的基础&#xff0c;也直接关系到网络连接的稳定性、安全性和效率。然而&#xff0c;面对众多IP地址设置选项&#xff0c;许多用户可能会感到困惑。那么&#xff0c;…...

vue-element-template优化升级dart-sass、pnpm

1、替换 node-sass 为 dart-sass - "node-sass": "^4.9.0","sass": "^1.75.0",替换css深度作用域写法 /deep/ >>># 替换为::v-deepVue&#xff1a;Node Sass VS. Dart Sass 2、替换npm为pnpm&#xff0c;需要补充一些依赖…...

Oracle拼接json字符串

在Oracle数据库中&#xff0c;并没有内建的JSON处理函数像其他现代数据库那样直接。但是&#xff0c;你可以使用字符串连接和格式化技巧来拼接JSON字符串。 以下是一个简单的例子&#xff0c;说明如何在Oracle中拼接一个JSON字符串&#xff1a; sql DECLARE v_json_string V…...

如何向Linux内核提交开源补丁?

2021年&#xff0c;我曾经在openEuler社区上看到一项改进Linux内核工具的需求&#xff0c;因此参与过Linux内核社区的开源贡献。贡献开源社区的流程都可以在内核社区文档中找到&#xff0c;但是&#xff0c;单独学习需要一个较长的过程&#xff0c;新手难以入门&#xff0c;因此…...

UniApp真机调试支付宝扫码,从‘报错’到‘跑通’的完整避坑指南

UniApp真机调试支付宝扫码&#xff1a;从报错到流畅运行的实战指南 第一次在UniApp中集成支付宝原生扫码功能时&#xff0c;我遇到了一个令人抓狂的问题——明明在模拟器上运行得好好的&#xff0c;一到真机调试就各种报错。经过反复尝试和查阅文档&#xff0c;终于找到了问题的…...

三电平 VSG 构网型变流器仿真分析

三电平 VSG 构网型变流器仿真 仿真使用双闭环控制&#xff0c;svpwm 调制 [1]包含 LC 滤波器 [2]包含中点电位平衡控制 [3]包含负荷投切与离网切换 基本工况&#xff1a;0—3s 功率指令 170kw3-6s 功率指令 140kw电网频率在 1-2s 暂降 0.2hz&#xff0c;vsg 通过 增发有功维持…...

AI辅助数据库设计:让快马平台智能生成优化过的社区论坛系统数据架构

今天想和大家分享一个用AI辅助设计数据库的实践案例——社区论坛系统的数据架构设计。整个过程在InsCode(快马)平台上完成&#xff0c;体验非常流畅。 业务场景分析 社区论坛的核心是内容交互&#xff0c;需要支持用户发帖、互动和管理。通过AI分析&#xff0c;我们确定了几个关…...

风电调频翻车实录:当虚拟惯性遇上二次跌落

双馈风力电机虚拟惯性控制下垂控制三机九节点一次调频模型 [1]系统为三机九节点模型&#xff0c;所有参数已调好且可调&#xff0c;可直接运行&#xff0c;风电渗透率19.4% [2]风机采用虚拟惯性下垂控制&#xff0c;转速回复模块&#xff0c;在系统频率跌落时释放转子动能提供有…...

计算机毕业设计269—基于python+深度学习+YOLOV8的交通标志识别系统(源代码+数据库+报告)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于python深度学习YOLOV8的交通标志识别系统(源代码数据库报告)269 一、系统介绍 1、用户&#xff1a; 在界面中选择各种图片&#xff0c;可以是自己在路边拍摄的图片&#xff0…...

终极指南:如何利用Everything-LLMs-And-Robotics快速掌握AI机器人核心技术

终极指南&#xff1a;如何利用Everything-LLMs-And-Robotics快速掌握AI机器人核心技术 【免费下载链接】Everything-LLMs-And-Robotics 项目地址: https://gitcode.com/gh_mirrors/ev/Everything-LLMs-And-Robotics 在人工智能与机器人技术融合的浪潮中&#xff0c;你是…...

透视表vs交叉表:用餐厅小费数据掌握Pandas两大分析利器

透视表vs交叉表&#xff1a;用餐厅小费数据掌握Pandas两大分析利器 在数据分析的日常工作中&#xff0c;我们经常需要对数据进行多维度的交叉分析。想象一下这样的场景&#xff1a;你手里有一家连锁餐厅过去三个月的小费数据&#xff0c;老板想知道不同时间段&#xff08;午餐/…...

终极指南:如何使用Scan4all识别和规避蜜罐陷阱的完整教程

终极指南&#xff1a;如何使用Scan4all识别和规避蜜罐陷阱的完整教程 【免费下载链接】scan4all 项目地址: https://gitcode.com/gh_mirrors/sc/scan4all 蜜罐作为网络安全领域的重要防御手段&#xff0c;常被用来诱捕攻击者并收集威胁情报。对于安全测试人员和渗透测试…...

如何快速搭建Sub-Web:Vue前端配置生成器完整指南

如何快速搭建Sub-Web&#xff1a;Vue前端配置生成器完整指南 【免费下载链接】sub-web 项目地址: https://gitcode.com/gh_mirrors/su/sub-web Sub-Web是基于Vue.js 2.6与subconverter后端实现的订阅配置自动生成Web界面&#xff0c;提供简洁美观的前端界面&#xff0c…...

AnimateDiff开源贡献:PyTorch核心代码解读与修改

AnimateDiff开源贡献&#xff1a;PyTorch核心代码解读与修改 1. 引言 如果你对AI视频生成感兴趣&#xff0c;可能已经听说过AnimateDiff这个强大的文生视频框架。它能够将静态的文字描述转化为生动的视频内容&#xff0c;效果相当惊艳。但你是否想过&#xff0c;这个看似神秘…...