Qt6之QScopedPointer——智能指针

手动管理堆分配的对象困难且容易出错,当指针场景复杂时,手动delete难免出错,常见的结果是代码泄漏内存并且难以维护。是时候使用现代和安全的一些方法了,那就是使用智能指针,比如 QScopedPointer std::unique_ptr,这些智能指针可以自动管理对象的生命周期。当智能指针的实例离开作用域时,它们会自动删除所管理的对象。

以下使用一个简单的QTime对象来演示各种内存管理方式:

1、栈中管理

这种声明方式将QTimer对象创建在栈(stack)上。栈上的对象在声明它们的函数或作用域结束时自动销毁。生命周期:由于对象是自动管理的,所以无需担心对象销毁或内存泄漏问题。当声明它的函数结束执行时,对象会自动进行清理。

void someFunction() {
    QTimer timer;
    connect(&timer, &QTimer::timeout, this, &MyClass::update);
    timer.start(1000);
    // timer在someFunction函数返回时被销毁
}

2、手动管理

通过调用 delete 来手动释放这个对象的内存。这通常在对象不再需要时进行

QTimer *timer = new QTimer();
// 使用timer进行相关操作
delete timer;  // 当不再需要时,手动删除对象

 

 3、在类中管理

如下,构函数中创建,析构函数中delete,在简单场景下并没有错;

class MyClass {
public:
    MyClass() {
        timer = new QTimer();
    }
    ~MyClass() {
        delete timer;
    }

private:
    QTimer *timer;
};

4、使用智能指针管理场景

由于使用 QScopedPointer 来管理 QTimer,这里不需要担心 QTimer 的释放,因为 QScopedPointer 会在其作用域结束时自动删除所管理的对象。因此,您可以安全地创建 QTimer 而不指定父对象,也不需要delete。

#ifndef TIMEREXAMPLE_H
#define TIMEREXAMPLE_H

#include <QObject>
#include <QTimer>
#include <QScopedPointer>

class TimerExample : public QObject {
    Q_OBJECT
public:
    explicit TimerExample(QObject *parent = nullptr);
    ~TimerExample();

private slots:
    void doSomething();

private:
    QScopedPointer<QTimer> timer;
};

#endif // TIMEREXAMPLE_H
#include "timerexample.h"
#include <QDebug>

TimerExample::TimerExample(QObject *parent)
    : QObject(parent) 
{
    timer = QScopedPointer<QTimer>(new QTimer());  // 创建QTimer时不指定父对象
    connect(timer.data(), &QTimer::timeout, this, &TimerExample::doSomething);
    timer->start(3000);
}

TimerExample::~TimerExample() {
    // 析构时QScopedPointer自动删除timer,无需手动删除
}

void TimerExample::doSomething() {
    qDebug() << "Timer ticked";
}

4.1 为什么没*号,它还是指针吗?到底对象是哪个?

 在使用 QScopedPointer 这样的智能指针时,声明的时候不需要在指针名前加 *,因为 QScopedPointer 本身就是一个模板类,它会自动将其模板参数类型指定为所管理的对象的指针类型。

new QTimer() 创建了一个 QTimer 对象,并将其初始化为 QScopedPointer<QTimer> 对象 timer 所管理的对象。

4.2  访问和管理成员对象时应该用箭头运算符“->”还是“*”?

timer 本身就是一个智能指针对象,它会自动管理一个 QTimer 类型的指针。这就意味着,在访问 QTimer 对象的成员函数时,需要使用 timer->,而不是 *timer.这与使用裸指针时的语法是一样的。

Qt官方示例中演示了复杂场景delete和QScopedPointer的对比,如下图:

函数有很多退出点,为了删除new出的对象,每个退出点都加入了delete,然后代码就臃肿、可读性、可维护性大大降低。用QScopedPointer改写上述代码后,简化后就是右图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

idea新建一个springboot项目

本文分为几个部分&#xff0c; 首先是在idea中新建项目&#xff0c; 然后是配置 项目的目录&#xff08;新建controller、service、dao等&#xff09;&#xff0c; 然后是自定义的一些工具类&#xff08;比如启动后打印地址等&#xff09;。 1.、创建篇 新建项目&#xff0…

分享|视频号带货如何运营才能实现盈利?

在当今数字化时代&#xff0c;视频号带货已经不仅仅是一种商业手段&#xff0c;更是一种生活方式和社交体验。运营视频号带货并实现盈利&#xff0c;需要我们从多个角度进行深入思考和创新实践。 首先&#xff0c;从用户体验的角度出发 我们需要关注观众的观看体验和购物体验。…

游戏登录界面制作

登录界面制作 1.导入模块和初始化窗口 import subprocessimport tkinter as tkimport picklefrom tkinter import messageboxwindow tk.Tk()window.title(Welcome)window.geometry(450x300) 导入必要的模块&#xff0c;并初始化了主窗口window&#xff0c;设置了窗口的标题和…

STM32完成软件I2C通讯

今天的重点是利用STM32的软件方案和MPU60506轴姿态传感器建立通讯&#xff0c;今天只完成了简单的发送地址和接收应答的部分&#xff0c;特此记录一下过程&#xff0c;以后忘记可以随时翻出来看看。 先介绍最基本的I2C通讯的最基本的6个时序&#xff1a; 一&#xff1a;起始条…

【Yolov系列】Yolov5学习(一)补充2:自适应锚框计算详解+代码注释

一、自适应锚框计算详解 自适应锚框计算的具体过程&#xff1a; ①获取数据集中所有目标的宽和高。 ②将每张图片中按照等比例缩放的方式到 resize 指定大小&#xff0c;这里保证宽高中的最大值符合指定大小。 ③将 bboxes 从相对坐标改成绝对坐标&#xff0c;这里…

预印本仓库ArXiv——防止论文录用前被别人剽窃

文章目录 一、什么是预印本二、什么是ArXiv2.1 ArXiv的领域2.2 如何使用 一、什么是预印本 预印本&#xff08;Preprint&#xff09;是指科研工作者的研究成果还未在正式出版物上发表&#xff0c;而出于和同行交流目的自愿先在学术会议上或通过互联网发布的科研论文、科技报告…

SQL Server 2022 安装及使用

SQL Server 2022 前言一、安装SQL Server 2022下载SQL Server 2022安装SQL Server 2022配置SQL Server 2022 二、安装SQL Server Management Studio下载SQL Server Management Studio安装SSMS-Setup-CHS 三、使用SQL Server 2022四、解决连接到服务器报错问题 前言 SQL Serve…

轻松get!分享4种关于iPhone通话记录怎么查询的方法

想要轻松了解你的iPhone通话记录&#xff1f;通话记录怎么查询&#xff1f;不用担心&#xff0c;我们在这篇文章中将分享四种简单有效的方法&#xff0c;帮助你查询iPhone上的通话记录。 无论是查看最近的通话记录还是检索特定日期范围内的通话历史&#xff0c;这些方法都能帮…

AI:162-如何使用Python进行图像识别与处理深度学习与卷积神经网络的应用

本文收录于专栏&#xff1a;精通AI实战千例专栏合集 从基础到实践&#xff0c;深入学习。无论你是初学者还是经验丰富的老手&#xff0c;对于本专栏案例和项目实践都有参考学习意义。 每一个案例都附带关键代码&#xff0c;详细讲解供大家学习&#xff0c;希望可以帮到大家。正…

AI大模型日报#0418:Stable Diffusion 3开放API、Meta新研究让AI Agent理解物理世界

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 微软刚发布了VASA-1 这个人工智能可以让单张图像具有生动的说话和歌唱能力 摘要: 微软发布了VASA-1人工智能&#xff0c;它能使单…

宿舍预付费管控云平台

1.宿舍预付费管控云平台概述 宿舍预付费管控云平台是一种创新的智能管理系统&#xff0c;专为学校、公寓等住宿环境设计&#xff0c;旨在提升管理效率&#xff0c;优化用户体验&#xff0c;并实现资源的高效利用。通过云端技术&#xff0c;该平台可以实现远程充值、实时消费记…

跨平台SIP 客户端-linphone下载、使用、开启视频H264

linphone 介绍 Linphone 是一种开源的语音和视频通信应用程序&#xff0c;它提供了基于互联网协议&#xff08;IP&#xff09;的实时通信功能。用于语音/视频通话、即时消息和电话会议的开源 SIP 电话。它适用于移动和桌面环境&#xff08;iOS、Android、GNU/Linux、macOS、Win…

【UE 材质】雨滴效果

在上一篇博客&#xff08;【UE 材质】表面湿润效果&#xff09;的基础上继续实现物体表面附加雨滴的效果 效果 步骤 1. 下载所需纹理 2. 创建一个材质并打开&#xff0c;添加如下节点&#xff0c;我们将纹理的RG通道输出的值和1组成一个三维向量&#xff0c;作为基本的法线效…

基于Bpmnjs适配Flowable的流程设计器

Flowable在7.x的版本就不提供流程设计器UI&#xff0c;为了广大流程爱好者能更好的使用Flowable&#xff0c;开发了一套完全适配Flowable的bpmnjs的流程设计流程设计器 支持开始事件支持结束事件支持边界事件支持中间事件支持网关事件支持子流程支持泳道泳池扩展微服务组件扩展…

C语言中的控制语句(分支语句 if、switch、三目运算符)

程序执行的三大流程 顺序 : 从上向下&#xff0c; 顺序执行代码分支 : 根据条件判断&#xff0c; 决定执行代码的分支循环 : 让特定代码重复的执行 分支语句 条件语句用来根据不同的条件来执行不同的语句&#xff0c;C语言中常用的条件语句包括if语句和switch语句。 if 语句…

lua 环境安装

下载地址&#xff1a; https://luabinaries.sourceforge.net/download.html 安装环境变量 检查一下是否安装成功&#xff0c;有版本号&#xff0c;打印一句话&#xff0c;如下表示成功 idea 安装插件&#xff0c;方便编写lua脚本 配置一下idea 运行测试 local function m…

python处理IP对应城市省份

python处理IP对应城市省份 IP地理地址库geoip2用法 数据包下载 数据包下载地址&#xff08;需要注册&#xff09; https://www.maxmind.com/en/accounts/258630/geoip/downloads 考虑到注册麻烦&#xff0c;可以到下面这个github的链接去直接下载 https://github.com/Hackl0…

LINUX网卡一般性问题分析

一、网卡相关概念 网卡&#xff1a;网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件。 网络模型&#xff1a;OSI网络模型、TCP/IP网络模型 LINUX网络收发流程&#xff1a; 1. 内核分配一个主内存地址段&#xff08;DMA缓冲区)&#xff0c;网卡设备可以在…

混合云自动化优势有哪些?

随着云计算领域变得更加动态&#xff0c;全球各地的组织都开始将混合云作为其IT基础设施效率、灵活性、安全性、可扩展性和成本效益的支柱。混合云将本地数据中心与公有云结合起来&#xff0c;为企业提供了灵活性和可扩展性&#xff0c;同时又能满足其对安全性、合规性和控制力…

整除分块(上下取整)

参考&#xff1a; 整除分块 - 知乎 董晓算法 G33 整除分块&#xff08;数论分块&#xff09; 图都是摘的上面的。 整除分块 整除分块是数论中的一个知识点。一个整除式子在分母不固定的时候&#xff0c;得到的结果也有可能不同&#xff0c;但是因为是整除&#xff0c;所以…