Qt的内存管理机制

news2025/1/16 20:19:33

QObject的parent设置为null
1.如果构造时直接指定了null,当前实例不会有父对象存在,Qt也不能自动析构该实例,除非实例超出作用域导致析构函数被调用,使用deletelater()函数,不建议使用delete
2.如果指定了parent,而又将它设置为null,那么当前实例会从父对象children中删除,不受到QObject&parent机制影响。
3.对于QWidget,parent为NULL时代表其为一个顶层窗口,QDialog,当parent不为NULL时他会显示在父widget中心区域的上层;如果QWidget的parent为NULL或是其他值,在其加入布局管理器或者QMainWindow设置widget时,会自动将parent设置为相应的父widget,在父控件销毁时这些子控件以及布局管理器对象会一并销毁。所有QWidget加入布局管理器或者QMainWindow设置widget时,就不需要手动释放其内存了,否则二次释放会崩溃。
4.对于在局部作用域上创建的父对象及其子对象,要注意对象销毁的顺序,因为父对象销毁时也会销毁子对象,当子对象会在父对象之后被销毁时会引发double free。
QWidget的内存释放:
1.使用QObject Parent机制
QWidget也是QObject的子类,所以在parent机制上是没有区别的,这种情况下可以上面二中描述是一样的
2.设置Qt::WA_DeleteOnClose
当你想让关闭窗口的时候,让窗口销毁,在构造函数中设置Qt::WA_DeleteOnClose标志:setAttribute(Qt::WA_DeleteOnClose);对于单纯显示而不需要和父控件做交互的widget,直接设置DeleteOnClose即可,close时widget会被自动析构。
3. 重写QCloseEvent事件
//delete this;//会发生崩溃
this->deletelater();
4. qDeleteAll和clear 针对容器的回收
QList<Def*> defs;
qDeleteAll(defs);
defs.clear();
QObjectCleanupHandler:
Qt 对象清理器是实现自动垃圾回收的很重要的一部分。QObjectCleanupHandler可以注册很多子对象,并在自己删除的时候自动删除所有子对象。同时,它也可以识别出是否有子对象被删除,从而将其从它的子对象列表中删除。这个类可以用于不在同一层次中的类的清理操作,例如,当按钮按下时需要关闭很多窗口,由于窗口的 parent 属性不可能设置为别的窗口的 button,此时使用这个类就会相当方便。

testMemory::testMemory(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    m_clearupHandler = new QObjectCleanupHandler;
}
testMemory::~testMemory()
{
    qDebug() << "~testMemory()---------------------------";
    delete m_clearupHandler;
    qDebug() << "m_btnVec size: " << m_btnVec.size();//3
    qDebug() << "m_btnVec data:  " << m_btnVec[0]->text();//崩溃 因为QPushButton*已经被delete
}
void testMemory::on_addPushBtn_clicked() {
    int size = m_btnVec.size() + 1;
    QPushButton* btn = new QPushButton;
    btn->setText(QString::number(size));
    m_btnVec.push_back(btn);
    m_clearupHandler->add(btn);
    qDebug() << "m_btnVec size:  " << m_btnVec.size();
}
void testMemory::on_deletePushBtn_clicked() {
    qDeleteAll(m_btnVec);
    qDebug() << "on_deletePushBtn_clicked---------------m_btnVec size: " << m_btnVec.size();;//3
    qDebug() << "m_btnVec data:  " << m_btnVec[0]->text();//崩溃 QPushButton* 被delete
    m_btnVec.clear();//qDeleteAll delete指针 需要手动清空qvector
    }

引用计数
应用计数是最简单的垃圾回收实现:每创建一个对象,计数器加 1,每删除一个则减 1。
在这里插入图片描述
利用Qt的信号槽机制,在对象销毁的时候自动减少计数器的值。但是,我们的实现并不能防止对象创建的时候调用了两次attach()。
在这里插入图片描述
现在我们的实现已经可以做到防止一个对象多次调用 attach() 和 detach() 了。然而我们不能保证对象一定会调用 attach() 函数进行注册。毕竟,这不是 C++ 内置机制。有一个解决方案是,重定义 new 运算符(这一实现同样很复杂,不过可以避免出现有对象不调用 attach() 注册的情况)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于电商商品数据API接口列表,你想知道的(详情页、Sku信息、商品描述、评论问答列表)

目录 一、商品数据API接口列表 二、商品详情数据API调用代码item_get 三、获取sku详细信息item_sku 四、获得淘宝商品评论item_review 五、数据说明文档 进入 一、商品数据API接口列表 二、商品详情数据API调用代码item_get <?php// 请求示例 url 默认请求参数已经URL…

数据结构-插入排序

一.概要 插入排序是一种基于比较的排序算法&#xff0c;其基本思想是将待排序的元素插入到已排序的序列中&#xff0c;形成新的有序序列。 插入排序算法的过程如下&#xff1a; 将待排序序列分为两部分&#xff1a;已排序部分和未排序部分&#xff1b; 初始时&#xff0c;已…

C++string类的详细使用方法

String类的详细使用 文章目录String类的详细使用初始化扩容空间resize与reserve扩容长度获取插入与删除函数运算符插入append插入assign字符串截取push_back尾插erase删除replase替换swap交换pop_back尾删substr截断字符串功能copy拷贝find查找rfind反向查找find_first_of匹配查…

三路快排(基于三指针单趟排序的快速排序)+快排时间复杂度再分析

目录 一.前言 二. 三路快排 &#x1f60d;算法思想: &#x1f60d;算法实现步骤: &#x1f60d;三指针单趟排序的实现:​ &#x1f60d;非递归快排完全体: &#x1f914;与C标准库里的快排进行对比测试: 三.快排时间复杂度再分析 一.前言 http://t.csdn.cn/mz8dghttp://…

SolidWorks2020安装教程

破解文件及步骤 和 安装包 hf&#xff1a;SolidWorks2020 即可 &#xff08;我的推广 共中号&#xff09; Before installation, block the outgoing Internet access by means of Windows Firewall or cord plug. Check .NET Framework 3.5 and 4.0 are installed. If .NET …

Hive安装与操作

目录 环境 数据 实验步骤与结果 &#xff08;1&#xff09;环境启动 &#xff08;2&#xff09;Hive基本操作 环境 Hadoop集群开发环境、mysql、Hive环境 数据 course.txt、sc.txt、student.txt 实验步骤与结果 &#xff08;1&#xff09;环境启动 ①执行命令&#xf…

JVM的内存结构(超详细附加大厂面试题)

内存结构 1、什么是 JVM &#xff1f; 1&#xff09;定义 Java Virtual Machine &#xff0c;Java 程序的运行环境&#xff08;Java 二进制字节码的运行环境&#xff09;。 2&#xff09;好处 一次编译&#xff0c;处处执行 自动的内存管理&#xff0c;垃圾回收机制 数组下…

结构重参数化宇宙(Re-parameterization Universe)

文章目录0. 前言1. Re-parameterization Universe1.1 RepVGG1.2. RepOptimizer2. 应用参考资料0. 前言 一方面&#xff0c;大量研究表明&#xff0c;多分支网络架构的性能普遍优于单分支架构&#xff1b;另一方面&#xff0c;相比多分支架构&#xff0c;单分支架构更有利于部署…

windows系统管理_windows server 2016 用户管理

用户账户的概述 **计算机用户账户&#xff1a;**由将用户定义到某一系统的所有信息组成的记录,账户为用户或计算机提供安 全凭证&#xff0c;包括用户名和用户登陆所需要的密码&#xff0c;以及用户使用以便用户和计算机能够登录到网络并 访问域资源的权利和权限。不同的身份拥…

自动控制原理模拟卷2

自动控制原理模拟题二 Question1 电炉温度控制系统原理如下图所示,分析系统保持电炉温度恒定的工作过程,指出系统的被控对象、被控量及各部件的作用,并画出系统方块图。 解: 电炉使用电阻丝加热,并要求保持炉温恒定,图中采用热电偶来测量电炉温并将其转换为电压信号,将…

Android 新版 Logcat 操作小技巧

新版的Android Studio中启用了新的 Logcat&#xff0c;有些小技巧这里介绍一下&#xff1a; 文章目录1. Logcat启动2. Logcat 搜索1. 搜索当前包名下的日志&#xff1a;2. 添加日志级别3. 添加标签4. 标签字段5. 排除字段6. 使用正则表达式7. 使用正则表达式排除8. 使用age截取…

初识C语言 ——“C Primer Plus”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是读一本好书&#xff0c;这一本书的名字就叫做《C Primer Plus》&#xff0c;那么&#xff0c;又回到了我们的初识C语言阶段啦&#xff0c;保证零基础都能看懂噢&#xff0c;下面&#xff0c;让我们进入C语言的…

app抓包实战

文章目录一、抓包原理二、常用应用场景三、过滤四、重发五、修改请求六、断点&#xff08;BreakPoint&#xff09;一、抓包原理 二、常用应用场景 解决移动端接口测试 解决接口测试过程中检查传参错误问题 mock测试&#xff08;虚拟的对象代替正常的数据、后端接口没有开发完成…

XXL-JOB分布式任务调度平台搭建以及和SpringBoot整合应用

1 前言 XXL-JOB 是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 可以前往 Gitee 地址进行下载使用&#xff1a; https://gitee.com/xuxueli0323/xxl-job.g…

计算机网络考试复习——第三章 3.1 3.2

本章考试范围为3.1 3.2 3.3 3.4 首先明确数据链路层在网络中是在物理层的上面从下网上看是在第二层&#xff0c;在数据链路层传输的单位是帧。 网络中的主机、路由器等都必须实现数据链路层&#xff0c;局域网中的主机、交换机等都必须实现数据链路层。 数据链路层的地位&am…

Win10 下编译 OpenCV 4.7.0详细全过程,包含xfeatures2d

在Win10下编译 OpenCV 4.7.0过程中&#xff0c;踩了几个坑&#xff0c;这里记录下来&#xff0c;供大家参考。 1. 下载源文件 GitHub上下载OpenCV 4.7.0源文件&#xff0c;及opencv_contrib-4.7.0&#xff0c;如果不方便下载&#xff0c;以下是百度网盘链接&#xff0c;有需要…

maven将jar包添加到本地仓库

第一步&#xff1a;下载需要添加的jar包 可以在maven库中查找下载&#xff0c;也可以在对应官网下载 maven库网址&#xff1a;https://mvnrepository.com/ 找到对应版本的jar包下载 第二步&#xff1a;将下载的jar包放到指定位置&#xff08;位置自己指定&#xff09;&#xf…

Spring的核心与设计思想

目录 IoC 传统程序开发思想 传统程序开发的缺陷 控制反转式程序开发 对比总结 理解Spring IoC DI 总结 我们通常所说的Spring指的是Spring Framework(Spring 框架),它是一个开源的框架,有着活跃而庞大的社区,Spring支持广泛的应用场景,可以让Java企业级的应用程序开发…

改进蚁狮优化算法

目录 ​1 主要内容 2 部分程序 3 程序结果 4 程序链接 ​1 主要内容 该程序方法复现《改进蚁狮算法的无线传感器网络覆盖优化》两种改进算法模型&#xff0c;即原始ALO算法的基础上添加了两种改进策略&#xff1a; - 改进1&#xff1a;将原先的间断性边界收缩因子变为连…

SpringAop 源码解析 (二) - 代理对象的创建以及执行过程

一、SpringAop 代理创建 以及 执行过程 在上篇文章中分析得出在使用 Aop 时&#xff0c;实际向 Spring 容器中注入了一个 AnnotationAwareAspectJAutoProxyCreator 动态代理 bean 生成处理器&#xff0c;该类有实现 BeanPostProcessor 扩展方法&#xff0c;并且在 postProcess…