QT内存管理

2023-11-16

Qt内存管理机制:Qt 在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,则是一个对象与另一个对象的从属关系。在 Qt 中,在 Qt 中,删除父对象会将其子对象一起删除。
C++中delete 和 new 必须配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大。Qt中使用了new却很少delete,因为QObject的类及其继承的类,设置了parent(也可在构造时使用setParent函数或parent的addChild)故parent被delete时,这个parent的相关所有child都会自动delete,不用用户手动处理。
但parent是不区分它的child是new出来的还是在栈上分配的。这体现delete的强大,可以释放掉任何的对象,而delete栈上对象就会导致内存出错,这需要了解Qt的半自动的内存管理。另一个问题:child不知道它自己是否被delete掉了,故可能会出现野指针。那就要了解Qt的智能指针QPointer。
在Qt中,最基础和核心的类是:QObject,QObject内部有一个list,会保存children,还有一个指针保存parent,当自己析构时,会自己从parent列表中删除并且析构所有的children。
Qt的半自动化的内存管理
(1)QObject及其派生类的对象,如果其parent非0,那么其parent析构时会析构该对象。
(2)QWidget及其派生类的对象,可以设置 Qt::WA_DeleteOnClose 标志位(当close时会析构该对象)。
(3)QAbstractAnimation派生类的对象,可以设置 QAbstractAnimation::DeleteWhenStopped。
(4)QRunnable::setAutoDelete()、MediaSource::setAutoDelete()。
(5)父子关系:父对象、子对象、父子关系。这是Qt中所特有的,与类的继承关系无关,传递参数是与parent有关(基类、派生类,或父类、子类,这是对于派生体系来说的,与parent无关)。

QObject是所有qt对象的基类
智能指针
1、QPointer
QPointer是一个模板类,QPointer可以监视动态分配空间的对象,并且在对象被 delete 的时候及时更新。
QPointer的现实原理:在QPointer保存了一个QObject的指针,并把这个指针的指针(双指针)交给全局变量管理,而QObject 在销毁时(析构函数,QWidget是通过自己的析构函数的,而不是依赖QObject的)会调用QObjectPrivate::clearGuards 函数来把全局 GuardHash 的那个双指针置为零,因为是双指针的问题,所以QPointer中指针当然也为零了。用isNull 判断就为空了。

2、std::auto_ptr
auto_ptr被销毁时会自动删除它指向的对象。
转自:https://blog.csdn.net/u013711616/article/details/52688581

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT内存管理 的相关文章

随机推荐

  • 程序员工资真的高吗?

    一直以来都很奇怪的事情 每当别人知道我晚上7点才下班 他们几乎都是会发出这样的惊呼 你居然这么晚才下班 而每当这个时候又轮到我来惊呼了 这么早7点就下班还算晚 每次打听别人的下班时间 要么5点30就下班了 要么6点就下班了 打听完了 这个时
  • 【A-Star算法】【学习笔记】【附GitHub一个示例代码】

    文章目录 一 算法简介 二 应用场景 三 示例代码 Reference 本文暂学习四方向搜索 一 算法简介 一个比较经典的路径规划的算法 相关路径搜索算法 广度优先遍历 BFC 深度优先遍历 DFC Di jkstra算法 最短路径问题 D
  • 实现 strStr() 函数

    实现 strStr 函数 给定一个 haystack 字符串和一个 needle 字符串 在 haystack 字符串中找出 needle 字符串出现的第一个位置 从0开始 如果不存在 则返回 1 示例 1 输入 haystack hell
  • STM32 电机教程 30 - 无刷无感入门2

    前言 无刷直流 Brushless Direct Current BLDC 电机是一种正快速普及的电机类型 它可在家用电器 汽车 航空航天 消费品 医疗 工业自动化设备和仪器等行业中使用 正如名称指出的那样 BLDC 电机不用电刷来换向 而
  • 面渣逆袭:计算机网络六十二问,三万字图文详解

    基础 1 说下计算机网络体系结构 计算机网络体系结构 一般有三种 OSI 七层模型 TCP IP 四层模型 五层结构 三种网络体系结构 简单说 OSI是一个理论上的网络通信模型 TCP IP是实际上的网络通信模型 五层结构就是为了介绍网络原
  • 小程序锚点定位(通讯录)

    1 使用视图容器组件scroll view 2 在scroll view中设置属性scroll into view 属性值为锚点id 3 在需要的位置设置锚点ID值 点击后将scroll into view设置为对应的id即可跳转 示例 名
  • idea空Maven项目部署Tomcat提示:no artifacts configured 、以及后续 No artifacts marked for deployment解决方案

    no artifacts configured 没有配置artifacts 关于artifacts的介绍推荐大家看这篇博文点击查看 我们先退到项目界面 右击项目名导入web程序所需的库 导入成功后继续配置tomcat 点击之后我们发现又报了
  • 聊聊网络安全等级保护“能力验证”:配置核查(Linux系统)

    前言 作为测评机构一定会知道每年会举行 能力验证 活动 申请认可和获准认可的合格评定机构通过参加能力验证活动 包括 CNAS 组织实施或承认的能力验证计划 测评机构间比对和测量审核 证明其技术能力 之前的线上会议也表明了对测评机构能力建设方
  • 关于Layui后台ajax返回问题

    刚接触LayUI 几次出现 返回的数据异常 问题 皆是因为数据的格式不对 这里做个小笔记 一般的格式这个样子 data result array code gt 0 msg gt count gt 100 data gt
  • pycm库详解_机器学习评价

    详细介绍pycm库的使用方法
  • qqkey获取原理_qqkey获取器下载

    qqkey获取工具 QQkey控制接收生成器 是一款类似于灰鸽子的一款软件 不同的是不能不能盗号 在你的好友打开了你配置的文件后 你可以在工具中获取到好友的QQkey信息 可以把对方的QQ当做的自己的QQ一样 想干嘛就干嘛 赶紧来下载使用吧
  • 在 esmodule 环境下使用 jsts

    文章目录 1 说明 Geometry 类 2 安装 3 使用 以 buffer 为例 4 JTS 文档 1 说明 jsts 完全就是根据其老妈 jts 的 java 包结构移植的 除了部分分析功能需要额外注意外 基本上所有的子模块的根路径位
  • C++ 中隐藏DOS调用的命令行窗口

    转自 http hi baidu com jackyho2000 blog item b5c5fabdd3b4db0019d81fbb html 我演示了一下在MFC程序中怎么应用DOS的dir的命令 可是我们遇到了需要解决的问题 首先就是
  • 包含抽象方法的类是抽象类吗?

    如果这个问题的范围是围绕 类 那么 包含抽象方法的类一定是抽象类 因为抽象方法的特征是 必须定义在抽象类中 但是话由说回来了 因为在JAVA中还有一种允许使用抽象方法的结构 那就是接口 在接口中的方法只能是抽象方法 不允许出现具体实现的方法
  • Python,创建map

    import matplotlib pyplot as mpp import os random math matplotlib version 3 5 1 numpy version 1 21 5 创建画布及坐标轴 def set cav
  • C语言二级题库(刷题软件+60套真题+填空题+大题)2022年9月份新题第三套

    文章只能发选择题 刷大题去刷题软件效果会更好 刷题软件 gongzhonghao 露露IT 选择题 1 下面选项中不是关系数据库基本特征的是 A 不同的列应有不同的列名 B 不同的列应有不同的数据类型 C 与行的次序无关 D 与列的次序无关
  • 业内常用即时传输网盘

    工具名称 业内常用即时传输网盘 功能简介 无需登录 短时间内有效 多用于传输小型敏感文件 外部链接 请见文内 内部网盘链接 在线站点 无网盘链接 使用说明 许多安全行内人士在团队内互传敏感文件时 为实现上传和下载文件时提供较快的速度和数据隐
  • 为什么我不使用JetBrains的屌炸天编辑器

    首先解释一下 JetBrains并没有出过一款叫做 屌炸天 的编辑器 作为一个提到编辑器圣战内心就无比激动的码农 我使用过JetBrains的大部分产品 从开始的PhpStorm 到PyCharm Intellij IDEA CLION a
  • XAML基础控件

    常用布局控件
  • QT内存管理

    Qt内存管理机制 Qt 在内部能够维护对象的层次结构 对于可视元素 这种层次结构就是子组件与父组件的关系 对于非可视元素 则是一个对象与另一个对象的从属关系 在 Qt 中 在 Qt 中 删除父对象会将其子对象一起删除 C 中delete 和