c++ new与delete与qt内存回收机制

2023-10-29

在c++ primer中读到 new 是在堆里面申请一段内存资源,new必须与delete成对使用,否则就会造成内存泄漏,可最近学qt,我经常可以看见只new而不delete的情况,是不是这样就内存溢出了?非也?百度了一下qt的内存管理机制,才恍然大悟,原文如下:

 

1.所有继承自QOBJECT类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被delete的时候delete的,所以如果一个程序中,所有的QOBJECT类都指定了父亲,那么他们是会一级级的在最上面的父亲清理时被清理,而不用自己清理;
2.程序通常最上层会有一个根的QOBJECT,就是放在setCentralWidget()中的那个QOBJECT,这个QOBJECT在 new的时候不必指定它的父亲,因为这个语句将设定它的父亲为总的QAPPLICATION,当整个QAPPLICATION没有时它就自动清理,所以也 无需清理。9这里QT4和QT3有不同,QT3中用的是setmainwidget函数,但是这个函数不作为里面QOBJECT的父亲,所以QT3中这个 顶层的QOBJECT要自行销毁)。
3.这是有人可能会问那如果我自行delete掉这些QT接管负责销毁的指针了会出现什么情况呢,如果时这样的话,正常情况下QT的拥有这个对象的 那个父亲会知道这件事情,它会直到它的儿子被你直接DELETE了,这样它会将这个儿子移出它的列表,并且重新构建显示内容,但是直接这样做时有风险的! 也就是要说的下一条
4.当一个QOBJECT正在接受事件队列时如果中途被你DELETE掉了,就是出现问题了,所以QT中建议大家不要直接DELETE掉一个 QOBJECT,如果一定要这样做,要使用QOBJECT的deleteLater()函数,它会让所有事件都发送完一切处理好后马上清除这片内存,而且 就算调用多次的deletelater也不会有问题。
5.QT不建议在一个QOBJECT 的父亲的范围之外持有对这个QOBJECT的指针,因为如果这样外面的指针很可能不会察觉这个QOBJECT被释放,会出现错误,如果一定要这样,就要记 住你在哪这样做了,然后抓住那个被你违规使用的QOBJECT的destroyed()信号,当它没有时赶快置零你的外部指针。当然我认为这样做是及其麻 烦也不符合高效率编程规范的,所以如果要这样在外部持有QOBJECT的指针,建议使用引用或者用智能指针,如QT就提供了智能指针针对这些情况,见最后 一条。
6.QT中的智能指针封装为QPointer类,所有QOBJECT的子类都可以用这个智能指针来包装,很多用法与普通指针一样,可以详见QT assistant

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

c++ new与delete与qt内存回收机制 的相关文章

随机推荐

  • PyTorch 中的数据类型 torch.utils.data.DataLoader

    DataLoader是PyTorch中的一种数据类型 在PyTorch中训练模型经常要使用它 那么该数据结构长什么样子 如何生成这样的数据类型 下面就研究一下 先看看 dataloader py脚本是怎么写的 VS中按F12跳转到该脚本 i
  • VSCODE 备注 //TODO 代码高亮方法

    VSCODE 备注 TODO 代码高亮方法 1 安装插件 2 插件配置如下 3 将配置直接复制进去 todohighlight defaultStyle color red backgroundColor ffab00 overviewRu
  • RabbitMQ安装教程

    整理了一下自己根据教程安装rabbitmq的过程 安装 环境 Linux CentOS 7 9 Erlang erlang 23 3 4 11 el7 x86 64 rpm RabbitMQ rabbitmq server 3 9 14 1
  • 20230901-文件保存

    文件保存 cpp文件 include widget h include ui widget h include
  • qt之操作鼠标 可控制鼠标连击 双击 定点点击 鼠标点击脚本等

    一 前言 一直想做一个鼠标连点器 但在网上照片各种鼠标点击软件 均不符合要求 要么收费 要么不好用 要么不好使 于是乎就想起自己会写程序 为何自己能动手非要吵吵呢 于是乎就着手去新建qt工程开始干 在qt文档里找了mouse类的api函数
  • 这款 AI 工具几分钟即可为品牌设计出高端产品图片? #Flair AI

    自动生成品牌所需的营销素材 这款 AI 工具的性能有多强大 Flair AI Flair AI 是一个品牌内容的 AI 设计工具 能够给品牌生成高质量的营销素材 根据用户的描述 自动创建出适合 CPG consumer packaged g
  • C++STL总结笔记(一)—— 容器和容器适配器

    文章目录 前言 一 概念 1 1 顺序容器 1 2 容器适配器 1 3 关联容器 二 程序示例 1 vector和Set自定义数据类型的访问 2 vector容器嵌套 3 list容器排序 4 pair对组的使用 总结 前言 STL是C 中
  • 【案例 5-4】字符串转换为二进制

    Test类 package anli5 4 字符串转换为二进制 import java util Scanner public class Test public static void main String args Scanner s
  • Spring Cloud的负载均衡Spring Cloud Ribbon和Spring Cloud Feign

    一 客户端负载均衡 Spring Cloud Ribbon Spring Cloud Ribbon是基于HTTP和TCP的客户端负载工具 它是基于Netflix Ribbon实现的 通过Spring Cloud的封装 可以轻松地将面向服务的
  • 如何看懂源代码--(分析源代码方法)

    由于今日计划着要看Struts 开源框架的源代码 昨天看了一个小时稍微有点头绪 可是这个速度本人表示非常不满意 先去找了下资料 觉得不错 摘自 繁体中文Traditional Chinese http www ithome com tw i
  • HT for Web (Hightopo) 使用心得(7)- 3D场景环境配置(阴影,灯光,环境光)

    在文章 Graph3dView 环境配置 天空球 雾化 辉光 景深 中 我们介绍了在 3D 场景中的一些环境配置 包括天空球 雾化 辉光 景深等 本篇文章我们继续补充其他的环境参数 阴影 灯光 环境光 由于本人缺乏艺术细胞 文章中配置的环境
  • vue 实现抽奖大转盘

    实际解决需求 前端只是负责页面转动 在用户点击时 请求中奖接口 同同时通过设置css属性 让转盘转动起来 当转盘转动结束后 根据请求后端接口回来的中奖信息 设置转盘的转动位置 然后进行弹窗显示中奖信息 在此时 注意要重置转盘的转动角度为初始
  • python组成结构_[Python入门学习]-Python项目的组织结构

    一 工程结构 二 编码规范 1 命名规范 包 使用小写字母命名 如果有多个单词 则用下划线分隔 正确的命名方式 lower with under 模块 使用小写字母命名 如果有多个单词 则用下划线分隔 正确的命名方式 lower with
  • Notepad++ 下载

    1 输入下载网址 https notepad plus plus org 2 点击download 3 开始下载安装包 下载好双击下面 跟着向导完成 在此处点击需要创建快捷方式 然后点安装 完成安装的效果
  • 排序算法系列1--简单排序(选择,冒泡,直接插入,希尔排序)

    排序是数据处理中十分常见的操作 现代高级语言都有现成的n种排序算法 但了解它们的代码 对计算机思维有帮助 简单选择排序 每一趟从待排序的数据元素中选择最小 或最大 的一个元素作为首元素 直到所有元素排完为止 简单选择排序是不稳定排序 无论数
  • Mysql数据库迁移:善用Navicat工具,事半功倍

    数据库迁移 在说到数据库迁移方面 像很多开发工作一样 简单有简单的做法 复杂有复杂的做法 就看怎么做了 那么什么样子的数据库迁移方式才是最优的 在这里是没有准确的定义的 但是我这边分享一个比较简单而言的数据库迁移方案 一 迁移方案描述 例如
  • Linux 别名的设置与修改

    装了个 Ubuntu 在终端下 输入 ll 将全部文件显示出来了 由于平时工作中使用的 suse 系统下 输入 ll 时是不会显示隐藏文件的 文件名前面带 的文件 而且一般很少使用隐藏文件 习惯问题 不希望它显示隐藏文件 打算改改 在终端下
  • STM32-基本知识梳理8-FATFS文件系统移植

    一 基本概念 1 为什么需要文件系统 在没有文件系统的存储器中 一般通过手工记录 那些变量存放在那些位置 很难有系统的管理 难以记录有效数据的位置 难以确定存储介质的剩余空间 不明确应以何种格式来解读数据 加入文件系统后 就可以引导区 目录
  • 运输层 :UDP用户数据报协议

    1 相关概念 UDP数据包产生 上层应用产生数据 但是这与真正发送的IP数据报数量并没有什么联系 并且UDP报文并不是一种可靠的协议 我们必须关注IP数据报的长度 如果超过MTU 在链路层的一种限制 则应该进行分片 2UDP报文 16位源端
  • c++ new与delete与qt内存回收机制

    在c primer中读到 new 是在堆里面申请一段内存资源 new必须与delete成对使用 否则就会造成内存泄漏 可最近学qt 我经常可以看见只new而不delete的情况 是不是这样就内存溢出了 非也 百度了一下qt的内存管理机制 才