QT之智能指针

news2025/2/1 14:57:15

        如果没有智能指针,程序员必须保证new对象能在正确的时机delete,四处编写异常捕获代码以释放资源,而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。

        来看看一个野指针例子

        程序将会异常结束,因为delete view 后 label也被delete了

 

        QPointer作为一个模板类,它有很类似与普通的指针,它会动态监视分配空间的对象是否被delete 了。它保存了一个QObject 的指针,并把这个指针的指针交给全局变量处理,在对象销毁时会调用 QObjectPrivate::clearGuards() 函数把双指针置为零,所以可以使用 QPointer::isNull() 判断是否已经被销毁。它不是线程安全的。该类在QT4被废弃了,但QT5又重写了

 

        看看局部变量,当show函数结束时并没有堆widget删除,导致内存溢出

        QSharedPointer  行为最接近原始指针,是最像指针的"智能指针", 与 QScopedPointer 一样包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针 ,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。实现了引用计数的可共享资源的强类型指针,它是线程安全的。它不能转让所有权。运行后,widget界面将会一闪而过,因为它已经在show()作用域结束时被销毁了

        QWeakPointer它实现了引用计数的可共享资源的弱类,它是线程安全的。在它所指向的资源的所有权期间,允许外界释放其资源从而使其放弃所有权,它更像是 QSharedPointer 的助手。在QT4它比QPointer更加高效,但是在QT5它被废弃啦,你不应该继续使用它

        QScopedPointer实现了非引用计数的独享资源的强类型指针,它是线程安全的。它的所有权不能转让,因为它的拷贝和赋值都是私有的

 

        QScopedArrayPointer派生自 QScopedPointer 它存储的是指向动态分配的对象指针,默认使用的是 delete [] 释放

 

        QSharedDataPointer可以指向一个隐式共享类对象。QSharedDataPointer<T>你可以很容易的实现自己的隐式共享类,QSharedDataPointer实现了线程安全的引用计数,从而保证了你自己写的可重入的隐式共享类不会因为加入QSharedDataPointer而变得不可重入。隐式共享应用在很多Qt类中,实现了速率和内存效率的有效结合

        EmployeeData 必需继承自QSharedData,QSharedData类是共享数据的基类,它提供引用计数,它只有默认的构造函数,拷贝构造函数和析构函数,一般情况下,我们有必要自己重写这几个函数。Employee数据成员只有一个QSharedDataPointer<EmployeeData>指针,所以对d访问必须通过->方法。当我们需要改变d的数据时,如果d的引用计数大于1的话,将会调用detach()对d进行拷贝生成新的对象。从而保证了所以对d的改变,不会影响到别的引用。Employee对象被拷贝、用于赋值或者当成参数传递时,QSharedDataPointer指针的引用技术自动增加1;Employee对象被销毁或者超出作用域时,QSharedDataPointer指针的引用计数将自动减小1.当QSharedDataPointer引用计数为0时将自动销毁。

它是深拷贝的

 

自动垃圾回收

        t 对象清理器是实现自动垃圾回收的很重要的一部分。QObjectCleanupHandler可以注册很多子对象,并在自己删除的时候自动删除所有子对象。同时,它也可以识别出是否有子对象被删 除,从而将其从它的子对象列表中删除。这个类可以用于不在同一层次中的类的清理操作,例如,当按钮按下时需要关闭很多窗口,由于窗口的 parent 属性不可能设置为别的窗口的 button,此时使用这个类就会相当方便。

 

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

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

相关文章

在 3ds Max 中创建逼真的玻璃材质

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 尽管本教程基于 3ds Max&#xff0c;但相同的设置适用于许多其他 3D 产品。 注意&#xff1a;单击每个步骤中的缩略图可查看更大的屏幕截图&#xff0c;其中包括视口和用户界面的相关部分。 步骤 1由于本教…

Linux的权限管理精细总结

&#xff08;该图由AI绘制 关注我 学习AI画图&#xff09; 目录 一、权限概述 1、权限的基本概念 2、为什么要设置权限 3、Linux用户身份类别 4、user文件拥有者 5、group文件所属组内用户 6、other其他用户 7、特殊用户root 二、普通权限管理 1、ls -l命令查看文件…

LED显示屏的8个常见信号干扰因素及解决方法

LED显示屏在使用过程中可能会受到多种信号干扰因素的影响&#xff0c;导致显示效果不理想或出现问题。以下是LED显示屏常见的信号干扰因素以及对应的解决方法&#xff1a; 1&#xff0c;电源干扰&#xff1a; 干扰因素&#xff1a;电源波动、电源噪声等。 解决方法&#xff1a…

jenkins发布使用邮件添加审批

首先安装好Email Extension Plugin插件并在 system下配置好邮件 然后配置流水线需要的参数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/418fc89bfa89429783a1eb37d3e4ee26.png#pic_center pipeline如下&#xff1a; def skipRemainingStages false //是否跳过生…

【原创】实现GPT中Transformer模型之框架概念

作者&#xff1a;黑夜路人 时间&#xff1a;2023年7月 GPT是什么意思 GPT的全称是 Generative Pre-trained Transformer&#xff08;生成型预训练变换模型&#xff09;&#xff0c;它是基于大量语料数据上训练&#xff0c;以生成类似于人类自然语言的文本。其名称中的“预训练”…

Knife4j-的使用(详细教程)

文章目录 前言一、简介二、版本参考三、基本使用1. 导入相关依赖2. 比对效果3. 增强特性应用 四、Spring-Cloud 整合1. 项目准备2. 实现步骤2.1 依赖引入2.2 编写配置类2.2.1基础信息配置2.2.2 配置接口信息2.2.3 安全认证配置 2.3 常用注解的使用2.3.1 Api2.3.2 ApiOperation2…

计算机组成2——存储系统

1. 硬件构成、工作原理、评价指标 2.主存储器 基本构成为DRAM&SRAMROM&#xff0c;工作原理为串行访问特点是采用多体交叉提高读取速度 RAM工作原理 SRAM的读写过程如下&#xff1a; WE控制读写&#xff1b; CS为片选信号&#xff1b; VCC为接地端&#xff1b; GND为…

GitLab 16.1创建新成员

GitLab 16.1界面有明显的变化,Admin Area在界面中不容易找到。 下面是找到Admin Area的方法。 本来是可以通过红框的链接找到Admin Area,但是这链接是http://127.0.0.1:8000/root,无法直接访问。 这里有两个方法进入。 方法1 将链接直接改成服务器ip,例如服务器ip是19…

【技术指南】3D转换工具HOOPS Exchange的功能特征和典型使用场景全解析(二)

什么是 HOOPS Exchange&#xff1f;HOOPS Exchange 是一组软件库&#xff0c;可以帮助开发人员在开发应用程序时读取和写入主流的 2D 和 3D 格式。HOOPS Exchange 支持 在主流的3D 文件格式中读取 CAD 数据&#xff0c;并支持将 3D 数据转换为 PRC 数据格式&#xff0c;这是一种…

Godot实用代码-存取存档的程序设计

1. Settings.gd 全局变量 用于保存玩家设置 对应Settings.json 2. Data.gd 全局变量 用于保存玩具数据 对应Data.json 实践逻辑指南 1.在游戏开始的时候&#xff08;游戏场景入口的_ready()处&#xff0c; Settings.gd

ceph对象存储和安装dashborad

一、ceph–RadosGW对象存储 数据不需要放置在目录层次结构中&#xff0c;而是存在于平面地址空间内的同一级别&#xff1b; 应用通过唯一地址来识别每个单独的数据对象; 每个对象可包含有助于检索的元数据&#xff1b; 在Ceph中的对象存储网关中&#xff0c;通过RESTful API在…

医院制剂研发与真实世界评价论坛圆满闭幕

医院制剂是新药的摇篮和宝库&#xff0c;现代科技为医院制剂的研发和转化赋能。在新时代新政策下&#xff0c;2023年07月16日&#xff0c;由湖南省药学会医院制剂研发与真实世界评价专业委员会&#xff08;下称“专委会”&#xff09;主委单位湖南易能生物医药有限公司&#xf…

划片机的技术分解

划片机是一种切割设备&#xff0c;主要用于将硬脆材料&#xff08;如硅晶圆、蓝宝石基片、LED基片等&#xff09;分割成较小的单元。其工作原理是以强力磨削为划切机理&#xff0c;通过空气静压电主轴带动刀片与工件接触点的划切线方向呈直线运动&#xff0c;将每一个具有独立电…

Java 设计模式——观察者模式

目录 1.概述2.结构3.案例实现3.1.抽象观察者3.2.观察对象3.3.具体观察者3.4.具体观察对象3.5.测试 4.优缺点5.使用场景6.JDK 源码解析——Observable / Observer6.1.Observable 类6.2.Observer 接口6.3.案例 1.概述 观察者模式 (Observer Pattern) 是一种行为型设计模式&#…

如何管理数据库用户

目录 一、数据库用户管理 新建用户 查询数据库中的用户 重命名用户名 删除用户 修改当前用户密码 修改其他用户密码 二、数据库用户授权 授权 允许用户在指定终端远程连接MySQL并拥有指定权限 撤销权限 授权用户权限总结 一、数据库用户管理 新建用户 命令&#x…

DP485替代MAX485 RS485/RS422 收发器芯片

DP485E 是一款 5V 供电、半双工、低功耗、低摆率&#xff0c;完全满足 TIA/EIA-485 标准要求的 RS-485收发器。DP485E 工作电压范围为 4.75~5.25V&#xff0c;具备失效安全&#xff08;fail-safe&#xff09;、过温保护、限流保护、过压保护&#xff0c;控制端口热插拔输入等功…

phoenix os在vmware workstation上的安装

一、点击创建新的虚拟机配置 选择“安装程序光盘映像文件”&#xff0c;选择你刚刚下好的PhoenixOS ISO镜像文件&#xff0c;点击下一步 分配虚拟机大小。随便你分配&#xff0c;只要大小恰当(系统大小预计会安装软件的大小3G以上的缓存及其他文件存放空间)&#xff0c;反正我就…

opencv -11 图像运算之按位逻辑运算(图像融合图像修复和去除)

按位逻辑运算是一种对图像进行像素级别的逻辑操作的方法&#xff0c;使用OpenCV的按位逻辑运算函数可以对图像进行位与&#xff08;AND&#xff09;、位或&#xff08;OR&#xff09;、位非&#xff08;NOT&#xff09;和位异或&#xff08;XOR&#xff09;等操作。 通俗点就是…

Java NIO 和 AIO 总结

title: Java NIO 和 AIO 总结 date: 2023-05-10 13:21:26 tags: NIOAIO categories:开发知识及其他 cover: https://cover.png feature: false 1. NIO Java NIO (New IO) is an alternative IO API for Java, meaning alternative to the standard Java IO and Java Networkin…

Unity Arduino 串口通信

一、Unity端发送消息&#xff0c;Arduino端接收消息 通过串口通信 Arduino端 #include <Arduino.h>#define PIN_KEY 5 uint item;void setup() {item 0;Serial.begin(115200);pinMode(PIN_KEY, OUTPUT); }void loop() {if(Serial.available()>0){item Serial.rea…