当前位置: 首页 > news >正文

QT智能指针

一.概述

   Qt智能指针是一种能够在不需要手动管理内存的情况下,自动释放资源的指针。它们是C++11的std::shared_ptr的一种扩展,可以用于管理Qt对象,尤其是那些不是QObject的对象。

使用智能指针可以避免内存泄露和悬垂指针等问题,同时也提高了代码的可读性和可维护性。

1.Qt框架提供了几种智能指针:

QSharedPointer:

这是一个引用计数式智能指针,允许多个指针共享同一个对象的所有权。当最后一个QSharedPointer被销毁或重置时,它所指向的对象才会被删除。

适用于需要在多个地方共享同一个对象的场景。

QWeakPointer:

这是一个弱引用智能指针,指向由QSharedPointer管理的对象,但不会增加对象的引用计数。

如果被观察的对象(即QSharedPointer所管理的对象)已经被释放,QWeakPointer将自动被设置为nullptr。

适用于需要观察但不拥有QSharedPointer所管理对象的场景。

QScopedPointer:

这是一个独占式智能指针,确保它所指向的对象在其生命周期内始终存在,并在QScopedPointer对象被销毁时自动删除其所指向的对象。

适用于那些不应该被多个所有者共享的资源。

QPointer:

QPointer是一个观察者指针,用于观察QObject及其子类的生命周期。它不会增加对象的引用计数,当QObject对象被删除时,QPointer会自动设置为nullptr。

需要注意的是,QPointer只能指向QObject或其子类的对象。

每种智能指针都有其特定的使用场景和优势,开发者应根据具体需求选择合适的智能指针类型。使用智能指针可以有效地避免内存泄漏和悬垂指针等问题,提高代码的安全性和稳定性。

二.代码示例

1.QPointer

QPointer是一个被保护的指针,行为类似于普通的c++指针T *,会在被引用的对象被销毁时自动清除(不像普通的C++指针,在这种情况下会成为“悬空指针”)。但是,T必须是QObject的子类,否则将导致编译失败或链接错误。

QPointer<QLabel> label = new QLabel;

label->setText("&Status:");

...

    if (label)

        label->show();

如果QLabel在此期间被删除,label变量将保存nullptr而不是一个无效的地址,最后一行将永远不会执行。

2.QScopedPointer

在Qt中实现线程安全的单例模式时,QScopedPointer 比较常用。

使用 QScopedPointer 管理动态分配的内存时,它会确保在包含该 QScopedPointer 的作用域结束时,所管理的对象会被自动释放,从而避免内存泄漏的问题。下面是一个示例:

#include <QScopedPointer>

#include <QDebug>

class Resource {

public:

    Resource() { qDebug() << "Resource 构造函数"; }

    ~Resource() { qDebug() << "Resource 析构函数"; }

};

void useResource()

{

    QScopedPointer<Resource> scopedResource(new Resource());

    // 执行一些操作,使用资源

    qDebug() << "使用资源...";

}

int main()

{

    useResource();

    qDebug() << "useResource 函数执行完毕";

    return 0;

}

如上,创建了一个名为 Resource 的类,并使用 QScopedPointer 在 useResource 函数内创建动态分配的 Resource 对象。当 useResource 函数结束时,QScopedPointer 的析构函数会被调用,并自动释放所管理的 Resource 对象。

3.QSharedPointer

特点:

用于管理动态分配的对象的所有权和生命周期。

当存在至少一个 QSharedPointer 指向对象时,对象的内存不会被释放。

当最后一个指向对象的 QSharedPointer 超出作用域时,对象的内存会被释放。

可通过复制 QSharedPointer 来增加对象的引用计数,确保对象在合适的时候被释放。

下面举个例子:

#include <QSharedPointer>

#include <QDebug>

class MyClass

{

public:

    MyClass(int value) : m_value(value)

    {

        qDebug() << "MyClass 构造函数,数值为" << m_value;

    }

    ~MyClass()

    {

        qDebug() << "MyClass 析构函数,数值为" << m_value;

    }

    void setValue(int value)

    {

        m_value = value;

    }

    int getValue() const

    {

        return m_value;

    }

private:

    int m_value;

};

int main()

{

    QSharedPointer<MyClass> pointer1(new MyClass(10)); // 创建一个 QSharedPointer 智能指针,用于管理 MyClass 对象

    {

        QSharedPointer<MyClass> pointer2 = pointer1; // 复制构造函数,增加了 MyClass 对象的引用计数

        qDebug() << "pointer1 的值为" << pointer1->getValue();

        qDebug() << "pointer2 的值为" << pointer2->getValue();

        pointer2->setValue(20); // 通过 pointer2 修改对象的值

        qDebug() << "pointer1 的值为" << pointer1->getValue();

        qDebug() << "pointer2 的值为" << pointer2->getValue();

    } // pointer2 超出作用域,减少了 MyClass 对象的引用计数

    qDebug() << "pointer1 的值为" << pointer1->getValue();

    return 0;

}

4.QWeakPointer

特点:

用于解决 QSharedPointer 可能导致的循环引用问题。

不会增加对象的引用计数,不影响对象的生命周期。

可以从 QSharedPointer 或者另一个 QWeakPointer 创建,用于在需要时保持对对象的非拥有者式引用。

如果关联的 QSharedPointer 被释放,QWeakPointer 会自动置空,避免悬空指针问题。

这里重点说下循环引用,当两个或多个对象彼此持有对方的强引用时,就会形成循环引用。这种情况下,对象无法被正常释放,会导致内存泄漏。Qt 的 QWeakPointer 类是为了解决这个问题而引入的。

QWeakPointer 允许创建一个弱引用指向被QSharedPointer管理的对象,但不会增加该对象的引用计数。弱引用不会阻止对象的销毁,即使所有强引用都失效,对象的析构函数也能被正确调用。

相关文章:

QT智能指针

一.概述 Qt智能指针是一种能够在不需要手动管理内存的情况下&#xff0c;自动释放资源的指针。它们是C11的std::shared_ptr的一种扩展&#xff0c;可以用于管理Qt对象&#xff0c;尤其是那些不是QObject的对象。 使用智能指针可以避免内存泄露和悬垂指针等问题&#xff0c;同时…...

C++笔记之pkg-config详解,以及g++、gcc编译时使用pkg-config

C++笔记之pkg-config详解,以及g++、gcc编译时使用pkg-config —— 2024-04-05 code review 文章目录 C++笔记之pkg-config详解,以及g++、gcc编译时使用pkg-config1.pkg-config详解`pkg-config` 的基本用法在 `g++`/`gcc` 编译时使用 `pkg-config`注意事项2.示例C++,普通编译…...

[Apple Vision Pro]开源项目 Beautiful Things App Template

1. 技术框架概述&#xff1a; - Beautiful Things App Template是一个为visionOS设计的免费开源软件&#xff08;FOSS&#xff09;&#xff0c;用于展示3D模型画廊。 2. 定位&#xff1a; - 该模板作为Beautiful Things网站的延伸&#xff0c;旨在为Apple Vision Pro用户…...

Qt Remote Objects (QtRO) 笔记

简介 Qt Remote Objects (QtRO) 是 Qt 的一个进程间通信模块。 术语 Source 是指提供服务或提供功能供其他程序使用的对象&#xff0c;是 RPC 中的被调用端。 Replica 是指 Source 对象的代理对象&#xff0c;用于 RPC 中的调用端&#xff0c;对 Replica 的调用请求将被转发…...

Unity类银河恶魔城学习记录12-6.5 p128.5 Create item by Craft源代码

此章节在原视频缺失&#xff0c;此过程为根据源代码推断而来&#xff0c;并非原视频步骤 Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩…...

UE4_如果快速做出毛玻璃效果_假景深

UE4_如果快速做出毛玻璃效果_假景深 2022-08-20 15:02 一个SpiralBlur-SceneTexture材质节点完成效果&#xff0c;启用半透明材质通过修改BlurAmount数值大小调整效果spiralBlur-SceneTexture custom节点&#xff0c;HLSL语言float3 CurColor 0;float2 BaseUV MaterialFloa…...

c# wpf LiveCharts 绑定 简单试验

1.概要 c# wpf LiveCharts 绑定 简单试验 2.代码 <Window x:Class"WpfApp3.Window2"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schem…...

【Kafka】Kafka安装、配置、使用

【Kafka】安装Kafka 1. 安装Kafka2. Kafka使用2.0 集群分发脚本xsync(重要)2.0.1 scp命令2.0.2 rsync远程同步工具2.0.3 写一个集群分发脚本xsync (Shell 脚本) 2.1 Zookeeper安装2.2 对Kafka进行分发2.2.1 执行同步脚本2.2.2 三台云主机配置Kafka环境变量 1. 安装Kafka Kafka…...

2024HW-->Wireshark攻击流量分析

在HW中&#xff0c;最离不开的&#xff0c;肯定是看监控了&#xff0c;那么就要去了解一些wireshark的基础用法以及攻击的流量&#xff01;&#xff01;&#xff01;&#xff01; 1.Wireshark的基本用法 比如人家面试官给你一段流量包&#xff0c;你要会用 1.分组详情 对于我…...

Lafida多目数据集实测

Lafida 数据集 paper&#xff1a;J. Imaging | Free Full-Text | LaFiDa—A Laserscanner Multi-Fisheye Camera Dataset 官网数据&#xff1a;https://www.ipf.kit.edu/english/projekt_cv_szenen.php 官网&#xff1a;KIT-IPF-Software and Datasets - LaFiDa 标定数据下载&…...

excel wps中编码格式转换

EXCEL报表&#xff1a;另存为CSV格式&#xff0c;转换成UTF-8编码 - 简书 (jianshu.com) 经验证管用...

【游戏分析】非游戏领空追字符串来源

通过NPC名称找NPC数组 扫描 NPC名字 ASIC型 发现全部都有后缀 那么采用 字节集的方式去扫描 也是扫不到 说明:不是ASIC型字符串 扫描 NPC名字 Unicode型 没有结果 那么转换成字节集去扫描 终于发现结果了 把结果挨个修改字符串 发现 其中两个是可以用的 22和23 …...

golang 数组和切片

区别 1.数组长度固定&#xff0c;切片长度可变 2.数组是深拷贝&#xff0c;切片是浅拷贝&#xff0c;切片是引用类型 扩容规则 不同版本不一样 https://www.jb51.net/article/280481.htm#_lab2_2_1 go1.18 1.如果期望容量大于当前容量的两倍就会使用期望容量&#xff1b; 2.如…...

物联网实战--入门篇之(九)安卓QT--开发框架

目录 一、QT简介 二、开发环境 三、编码风格 四、设计框架 五、总结 一、QT简介 QT是一款以C为基础的开发工具&#xff0c;已经包含了很多常用的库&#xff0c;除了基本的GUI以外&#xff0c;还有网络、数据库、多媒体、进程通信、串口、蓝牙等常用库&#xff0c;开发起来…...

【leetcode面试经典150题】16.接雨水(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…...

互联网面经

腾讯视频 代码&#xff1a;反转链表&#xff0c;单例模式 RAII,哪里用到 Web服务器怎样处理请求 get\post流程 项目使用的还是http1.0吗&#xff1b;http2.0&#xff1a;二进制、首部压缩、主动推送&#xff1b;Https Epoll/select/poll ET/LT 进程地址空间。3…...

xss介绍及作用

XSS&#xff08;Cross-Site Scripting&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者向网站注入恶意的客户端脚本代码&#xff0c;从而在用户的浏览器中执行这些代码。 XSS攻击的原理是攻击者将恶意脚本插入到网页中的用户输入数据中&#xff0c;当其他用户访…...

PostgreSQL入门到实战-第二弹

PostgreSQL入门到实战 PostgreSQL安装之Windows官网地址PostgreSQL概述Windows上安装PostgreSQL更新计划 PostgreSQL安装之Windows 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.postgresql.org/PostgreSQL概…...

3-【PS让图片动起来】系列1-【导入素材】

【问题介绍】仅做图片&#xff0c;现在很难吸引用户视线&#xff0c;越来越多地图片需要动起来增添意境&#xff0c;比如春日樱花花瓣掉落、冬季雪花纷纷&#xff0c;今天来学学怎么用PS的时间轴&#xff0c;让图片动起来~ 如下图&#xff0c;一副冬日雪景图&#xff0c;想给画…...

基于Java+SpringBoot+Mybaties+layui+Vue+elememt 实习管理系统 的设计与实现

一.项目介绍 前台功能&#xff1a;用户进入系统可以实现首页&#xff0c;系统公告&#xff0c;个人中心&#xff0c;后台管理等功能进行操作 后台由管理员&#xff0c;实习单位&#xff0c;教师和学生&#xff0c;主要功能包括首页&#xff0c;个人中心&#xff0c;班级管理&am…...

非关系型数据库——Redis基本操作

目录 一、Redis数据库常用命令 1.Set——存放数据 2.Get——获取数据 3.Keys——获取符合条件的键值 4.Exists——判断键值是否存在 5.Del——删除指定键值 6.Type——获取键值对应的类型 7.Rename——对已有键值重命名&#xff08;覆盖&#xff09; 8.Renamenx——对…...

golang语言和JAVA对比

引言: 在当今的软件开发领域,有许多编程语言供开发人员选择。其中,Golang和Java是两种备受开发者青睐的语言。本文将探讨Golang和Java之间的比较和对比,分析它们在语言特性、性能、平台支持、社区和生态系统、开发效率和可维护性等方面的异同。 一、语言特性和性能 Golang…...

隐私计算实训营学习九:隐语多方安全计算在安全核对的行业实践

文章目录 一、业务背景&#xff1a;安全核对产生的土壤二、产品方案&#xff1a;从试点到规模化的路三、技术共建&#xff1a;与隐语的共同成长 一、业务背景&#xff1a;安全核对产生的土壤 业务背景&#xff1a;很多粗放使用数据的方式被新出台的法律法规所规范&#xff0c;…...

C#实现只保存2天的日志文件

文章目录 业务需求代码运行效果 欢迎讨论&#xff01; 业务需求 在生产环境中&#xff0c;控制台窗口不便展示出来。 为了在生产环境中&#xff0c;完整记录控制台应用的输出&#xff0c;选择将其输出到文件中。 但是&#xff0c;存储所有输出的话会占用很多空间&#xff0c;…...

C++ 类和对象(中篇)

类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情 况下&#xff0c;都会自动生成下面6个默认成员函数。 构造函数&#xff1a; 定义&#xff1a;构造函数是一个特殊的成员…...

可视化场景(9):智慧看板,可能是最直观的数据展示

10年经验的大数据可视化和数字孪生老司机&#xff0c;该领域的专家&#xff0c;是您可信赖的技术合伙人&#xff0c;分享该领域的项目和作品&#xff0c;欢迎互动交流。 hello&#xff0c;我是贝格前端工场&#xff0c;本期分享可视化大屏在安全生产与设备运维场景的应用&#…...

加密算法(二)

1、SHA-256加密算法&#xff1a; package com.arithmetic.encryption; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; //使用java.security.MessageDigest类来进行SHA-256摘要的计算。 //通过getInstance("SHA-256")方法获取…...

大创项目推荐 深度学习 YOLO 实现车牌识别算法

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 该项目较…...

IP知识详解

IP基本认识 IP 在 TCP/IP 参考模型中处于第三层&#xff0c;也就是网络层。 网络层的主要作用是&#xff1a;实现主机与主机之间的通信&#xff0c;也叫点对点&#xff08;end to end&#xff09;通信。 网络层与数据链路层有什么关系呢&#xff1f; IP 的作用是主机之间通信…...

设计模式:适配器模式

定义 适配器模式&#xff08;Adapter Pattern&#xff09;&#xff0c;也称为包装器&#xff08;Wrapper&#xff09;模式&#xff0c;是一种结构型设计模式&#xff0c;它允许不兼容的接口之间进行交互。适配器模式通过包装一个已有的类&#xff0c;提供一个与原系统兼容的接…...

网站开发顶岗实习报告/小广告怎么能弄干净

不知道为什么自己突然想把一切都写下来&#xff0c;或许对她的爱是那么的深&#xff0c;永远都不想忘记。Msn突然亮了&#xff0c;兴奋的点开&#xff0c;发现她发来的信息&#xff0c;“不知道咱们怎么继续下去了”。一句话验证了我多日的困扰&#xff0c;她又说出这种话了&am…...

邮箱域名怎么填写/网络关键词优化方法

在以前分析过ORA-600[729](SGA内存泄露),这次遇到ORA-600[723](PGA内存泄露)操作系统数据库信息ORACLE V9.2.0.3.0 - Production vsnsta0vsnsql12 vsnxtr3Windows 2000 Version 5.2 Service Pack 2, CPU type 586Oracle9i Enterprise Edition Release 9.2.0.3.0 - ProductionWi…...

人工智能平台/武汉seo技术

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2021年危险化学品经营单位安全管理人员新版试题及危险化学品经营单位安全管理人员实操考试视频&#xff0c;包含危险化学品经营单位安全管理人员新版试题答案和解析及危险化学品经营单位安全管理人员实操考试视频练习…...

wordpress debian密码/百度答主招募入口官网

我是天空的一片云&#xff0c;偶尔投影在你的波心&#xff0c;你记得也好&#xff0c;最好你忘掉&#xff0c;你我在交汇时&#xff0c;互放的光亮。 ——徐志摩《偶然》 乐观的人说&#xff1a;人生是一条有很多分叉的道路&#xff0c;你永远都会站在十字路口上&#xff0c;不…...

手机批发市场进货网站/seo搜索引擎优化营销案例

一函数原型及参数function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer;hWnd &#xff1a;对话框父窗口句柄&#xff0c;对话框显示在 Delphi 窗体内&#xff0c;可使用窗体的 Handle 属性&#xff0c;否则可用 0 &#xff0c;使其直接作为桌面窗口的子…...

ps和dw 做网站/谷歌play

bootstrap默认 html&#xff5b;font-size: 10px;} rem是一个相对大小的值&#xff0c;它相对于根元素<html>&#xff0c; 比如假设&#xff0c;我们设置html的字体大小的值为 html&#xff5b;font-size: 87.5%;&#xff5d;&#xff08;也就是14px&#xff09;。然后其…...