Qt的内存管理机制

      在Qt中,显式使用new创建的对象通常不需要显式调用delete来释放内存,这是因为Qt提供了一种基于对象树(Object Tree)和父子关系(Parent-Child Relationship)的内存管理机制。这种机制可以自动管理对象的生命周期,确保在适当的时候释放内存:

      在Qt中,每个QObject或其派生类(如QWidget、QPushButton)都可以有一个父对象(Parent)。

      当创建一个对象时,如果指定了父对象,则该对象会被添加到父对象的子对象列表中。

      当父对象被销毁时,Qt会自动递归销毁其所有子对象,从而释放内存。

      QObject的析构函数会遍历其子对象列表,并递归调用每个子对象的析构函数。这种机制确保了所有子对象都会被正确释放。

      显式调用delete仅在对象没有父对象或需要手动管理生命周期时才需要。

      对象树

      (1).QObject在对象树中自我组织(QObjects organize themselves in object trees)。当你创建一个以另一个对象为父对象的QObject时,它会被添加到父对象的 children()列表中,并在父对象被删除时被删除。事实证明,这种方法非常适合GUI对象的需求。例如,QShortcut(键盘快捷键)是相关窗口的子对象,因此当用户关闭该窗口时,快捷方式也会被删除。

      (2).QWidget是Qt Widgets模块的基类,它扩展了父子关系(parent-child relationship)。QWidget继承自QObject、QPaintDevice。

      (3).你还可以自行删除子对象,这些子对象会从其父对象中移除

      (4).每个QObject都可以参与对象树。每个QObject都有一个子对象列表,也可能有一个父QObject。当QObject被销毁时,其所有附加子对象都会随之销毁。

      对象树(Object Tree)是由父对象(Parent Object)及其子对象(Child Objects)构成的树状结构。在这个结构中,每一个对象都可以拥有子对象,而每个子对象又只能有一个父对象。这种父子关系不仅反映了对象之间的层级结构,还意味着当父对象被销毁时,所有的子对象也将被自动销毁。

      QObject构造/析构顺序:当QObject在堆(heap)上创建时(即使用new创建),可以按任意顺序从它们构建树,之后,可以按任意顺序销毁树中的对象。当删除树中的任何QObject时,如果该对象有父对象,则析构函数会自动从其父对象中删除该对象。如果该对象有子对象,则析构函数会自动删除每个子对象。无论析构顺序如何,都不会删除两次QObject。

      QObject包含许多用于检查此对象树的方法:

      (1).parent():获取对象的父对象,或为null。

      (2).setParent():设置对象的父对象。

      (3).children():获取属于该对象的子对象列表。

      在Qt框架中,几乎所有的事物都是对象。对象通常使用动态内存分配(Dynamic Memory Allocation)创建,即通过new关键字。在Qt中,当一个对象被创建时,可以指定另一个对象作为它的父对象。这种关系建立后,子对象的生命周期便与父对象紧密相关。当父对象被销毁时,它会自动销毁其所有子对象,从而保证资源的正确释放。

      C++中的继承主要用于代码复用和多态性,而Qt中的父子关系主要用于内存管理和对象生命周期的控制

      下载Qt6.8源码:

git clone git://code.qt.io/qt/qt5.git
cd qt5
git submodule update --init --recursive
git checkout v6.8.0

      以下为测试代码:

#include <QObject>
#include <QDebug>namespace {class MyObject : public QObject {
public:explicit MyObject(const QString& name, QObject* parent = nullptr) : QObject(parent), name_(name){qDebug() << "Constructor: " << name_;}~MyObject(){qDebug() << "Destructor: " << name_;}QString name() const{return name_;}private:QString name_{};
};} // namespaceint test_memory_management()
{MyObject* parent = new MyObject("parent object");MyObject* child1 = new MyObject("child object1", parent);//MyObject* child2 = new MyObject("child object2", parent);MyObject* child2 = new MyObject("child object2");child2->setParent(parent);for (auto obj : parent->children()) {qDebug() << "child object name: " << ((MyObject*)obj)->name();}qDebug() << "child2 parent object name: " << ((MyObject*)child2->parent())->name();delete parent; // manually delete the parent objectreturn 0;
}

      执行结果如下图所示:

      GitHub:https://github.com/fengbingchun/Qt_Test

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

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

相关文章

React:React主流组件库对比

1、Material-UI | 官网 | GitHub | GitHub Star: 94.8k Material-UI 是一个实现了 Google Material Design 规范的 React 组件库。 Material UI 包含了大量预构建的 Material Design 组件&#xff0c;覆盖导航、滑块、下拉菜单等各种常用组件&#xff0c;并都提供了高度的可定制…

排序算法(插入,希尔,选择,冒泡,堆,快排,归并)

1.插入排序 插入排序的主要思想是额外申请一个空间cur&#xff0c;让cur一开始等于数组的第1号位置,设置i1&#xff0c;让i-1的元素与其比较&#xff0c;如果arr[i-1]>arr[i]&#xff0c;就让arr[i1] arr[i]&#xff0c;当进行到最后一次对比结束&#xff0c;i-1,再让arr[…

python学习笔记--实现简单的爬虫(二)

任务&#xff1a;爬取B站上最爱欢迎的编程课程 网址&#xff1a;编程-哔哩哔哩_bilibili 打开网页的代码模块&#xff0c;如下图&#xff1a; 标题均位于class_"bili-video-card__info--tit"的h3标签中&#xff0c;下面通过代码来实现&#xff0c;需要说明的是URL中…

Vue3 实现pdf预览

1.使用到的插件 vue3-pdf-app 以及预览效果 2.下载依赖 // 可以使用npm 以及pnpm // 下载版本1.0.3 pnpm install vue3-pdf-app^1.0.3 3.封装pdfModel组件复用 <template><VuePdfApp :page-scale"pageScale" :theme"theme" :style"width: …

SpringBoot集成Elasticsearch 7.x spring-boot-starter-data-elasticsearch 方式

SpringBoot集成Elasticsearch 7.x | spring-boot-starter-data-elasticsearch 方式 前言添加maven依赖配置application.properties测试实体类 方式一&#xff1a;继承 ElasticsearchRepository&#xff08;适合简单查询&#xff09; 直接使用想自定义自己的Repository接口 方式…

【Clang AST】基于 Clang 获取分析 AST

The Clang AST AST&#xff08;Abstract Syntax Tree&#xff09;抽象语法树 AST是什么 抽象语法树&#xff08;Abstract Syntax Tree, AST&#xff09;是源代码的抽象表示&#xff0c;广泛用于编译器和分析工具中。 AST将源代码的语法结构转换为树形结构&#xff0c;其中每…

onedav一为导航批量自动化导入网址(完整教程)

OneNav作为一个功能强大的导航工具,支持后台管理、加密链接、浏览器书签批量导入等功能,能够帮助用户轻松打造专属的导航页面。今天,我将为大家详细介绍如何实现OneNav导航站的批量自动化导入网址。 1、建立要批量导入的表格 格局需要创建表格,表格的要求是一定要有需要,…

文档处理控件Aspose.Words 教程:.NET版中增强的 AI 文档摘要功能

Aspose.Words是一个功能强大的 Word 文档处理库。它可以帮助开发人员自动编辑、转换和处理文档。 自 24.11 版以来&#xff0c;Aspose.Words for .NET 提供了 AI 驱动的文档摘要功能&#xff0c;使用户能够从冗长的文本中快速提取关键见解。在 25.2 版中&#xff0c;我们通过使…

AI本地部署之dify

快捷目录 Windows 系统一、环境准备:首先windows 需要准备docker 环1. 安装Docker desktop2. 安装Docker3. 配置Docker 镜像路径4. 配置Docker 下载镜像源5. 重启Docker服务二、Dify 下载和安装1. Dify下载2. Dify 配置3. Dify 安装附件知识:4. Dify创建账号三、下载Ollama d…

DDS协议(二)

一、DDS发布订阅机制 基于发布/订阅的数据分发服务为各种虚拟机载设备之间的通信提供了统一的底层支撑 其技术原理如图所示&#xff1a; 发布方应用程序和订阅方应用程序分别同发布/订阅中间件通信&#xff0c; 而数据的实际分发是由发布/订阅中间件来处理。 发布方将包含主题…

GitHub供应链攻击事件:Coinbase遭袭,218个仓库暴露,CI/CD密钥泄露

此次供应链攻击涉及GitHub Action "tj-actions/changed-files"&#xff0c;最初是针对Coinbase的一个开源项目的高度定向攻击&#xff0c;随后演变为范围更广的威胁。 攻击过程与影响 Palo Alto Networks Unit 42在一份报告中指出&#xff1a;“攻击载荷主要针对其…

transform

http://zhihu.com/question/445556653/answer/3254012065 西科技的文章 视频讲解 小白也能听懂的 transformer模型原理详解 self- attention 多头注意力机制 encoder decoder 机器翻译_哔哩哔哩_bilibili

Spring Boot 整合 Nacos 注册中心终极指南

在微服务架构中&#xff0c;配置管理和动态路由是核心需求。Nacos 作为阿里巴巴开源的动态服务发现、配置管理和服务管理平台&#xff0c;能够帮助开发者实现配置热更新、多环境共享配置以及动态路由管理。本文将结合 Spring Boot 和 Spring Cloud Gateway&#xff0c;手把手教…

网络基础梳理

为什么要有网络呢&#xff1f; 在一开始科学家们都是自己在计算机当中做实验但是难免需要共同进行科研。假设现在一个业务需要三个人共同完成&#xff0c;那么现在就有问题了&#xff1a; 由于第一个人完成工作前&#xff0c;其他两人无法开始&#xff0c;这导致工作流程是串行…

EMS小车技术特点与优势:高效灵活的自动化输送解决方案

北成新控伺服技术丨EMS小车调试视频 EMS小车是一种基于单轨运行的电动输送系统&#xff0c;通过电力驱动实现物料的高效搬运和输送&#xff0c;具有高效灵活、节能环保、多功能集成、行业适配性强等特性&#xff0c;广泛应用于汽车制造、工程机械、家电生产、仓储物流等行业自动…

Python实现deepseek接口的调用

简介&#xff1a;DeepSeek 是一个强大的大语言模型&#xff0c;提供 API 接口供开发者调用。在 Python 中&#xff0c;可以使用 requests 或 httpx 库向 DeepSeek API 发送请求&#xff0c;实现文本生成、代码补全&#xff0c;知识问答等功能。本文将介绍如何在 Python 中调用 …

2025清华大学:DeepSeek教程全集(PDF+视频精讲,共10份).zip

一、资料列表 第一课&#xff1a;Deepseek基础入门 第二课&#xff1a;DeepSeek赋能职场 第三课&#xff1a;普通人如何抓住DeepSeek红利 第四课&#xff1a;让科研像聊天一样简单 第五课&#xff1a;DeepSeek与AI幻觉 第六课&#xff1a;基于DeepSeek的AI音乐词曲的创造法 第…

“智改数转”新风口,物联网如何重构制造业竞争力?

一、政策背景 为深化制造业智能化改造、数字化转型、网络化联接&#xff0c;江苏省制定了《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划&#xff08;2025&#xff0d;2027年&#xff09;》&#xff0c;提出到2027年&#xff0c;全省制造业企业设备更新、工艺…

OpenHarmony 入门——ArkUI 跨页面数据同步和页面级UI状态存储LocalStorage小结(二)

文章大纲 引言一、在代码逻辑使用LocalStorage二、从UI内部使用LocalStorage三、LocalStorageProp和LocalStorage单向同步四、LocalStorageLink和LocalStorage双向同步五、兄弟组件之间同步状态变量七、将LocalStorage实例从UIAbility共享到一个或多个视图 引言 前面一篇文章主…

干货分享|DeepSeek技术革命、算力范式重构与场景落地洞察

本文为TsingtaoAI公司负责人汶生为某证券公司管理层和投资者教授的《DeepSeek技术革命、算力范式重构与场景落地洞察》主题培训内容&#xff0c;此次主题培训系统阐述了当前AI技术演进的核心趋势、算力需求的结构性变革&#xff0c;以及行业应用落地的关键路径。 现在我们将全…