Qt——智能指针实战
目录
- 前言
- 正文
- 一、理论介绍
- 1、QPointer
- 2、QScopedPoint
- 3、QSharedPoint
- 4、QWeakPoint
- 二、实战演练
- 1、QPoint
- 2、QScopedPoint
- 3、QSharedPoint
- a、示例一
- b、示例二
- 4、QWeakPoint
- END、总结的知识与问题
- 参考
前言
智能指针的使用,对很多程序员来说,都算是比较高深的存在,但又老是感觉这是一个值得去掌握,且需要去掌握的东西,所以,这次下定决心,来掌握一下Qt的智能指针的使用,当然,最常用的肯定是QSharedPoint这个了,其他的应该也就是顺带着讲一讲,并且,普及一些知识,从而让自己的能力更上一层楼把。
正文
一、理论介绍
1、QPointer
QPointer是Qt提供的空安全的智能指针,它用于解决悬挂指针的问题。QPoint在对象被删除后,会自动被设置为nullptr,避免访问已经无效的对象,它类似于普通指针,但提供了一些安全检查。
总结来说就是:
当你创建一个对象,然后使用QPointer指向这个对象,若出现delete 了那个对象,但是未将那个对象置空的情况的话,判断的时候,直接判断QPointer对象,就可以知道到底是真的删除了那个对象,还是假的删除了。避免了悬挂指针的问题。
QPoint 充当一个管家的角色,对真正的指针做好判断。
2、QScopedPoint
QScopedPoint 是Qt提供的独占式的智能指针,用于管理动态分配的对象,QScopedPoint 在超出作用域时,自动删除对象,确保对象在不再需要时,被正确释放。
3、QSharedPoint
QSharedPoint 是Qt提供的共享引用计数的指针,可用于管理动态分配的对象。它通过引用计数跟踪对象的引用次数,当引用次数归零时,会自动删除对象。可以通过多个QSharedPoint共享同一个对象,对象会在最后一个引用者释放它时,才会被删除。
4、QWeakPoint
QWeakPoint 是Qt提供的弱引用智能指针,用于解决循环引用的问题。QWeakPoint 可以引用由QSharedPoint管理的对象,但不会增加引用计数的次数。QWeakPoint需要转换成QSharedPoint才能访问对象,当引用计数为0时,访问会失败。
二、实战演练
1、QPoint
MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QPointer>
#include <QDebug>
class MyClass : public QObject
{Q_OBJECTpublic:MyClass(const QString& name): m_name(name){qDebug() << "MyClass 构造函数,名称为:"<<m_name;}~MyClass(){qDebug() << "MyClass 析构函数,名称为:"<<m_name;}QString getName() const {return m_name;}private:QString m_name;
};#endif // MYCLASS_H
main.cpp
#include <QCoreApplication>
#include <QPointer>
#include <QDebug>
#include "MyClass.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);MyClass *obj = new MyClass("test");QPointer<MyClass> myObject(obj);if (myObject){qDebug() << "对象存在,名称为" << myObject->getName();}else{qDebug() << "对象不存在";}delete obj;if (myObject){qDebug() << "对象存在,名称为" << myObject->getName();}else{qDebug() << "对象不存在";}return a.exec();
}
2、QScopedPoint
void MainWindow::TestQScopedPointer()
{useResource();qDebug() << "useResource 函数执行完毕";
}void MainWindow::useResource()
{QScopedPointer<Resource> scopedResource(new Resource());;//执行一些操作,使用资源qDebug() << "---> 使用资源 ";
}
QScopedPoint 在适当的时候,会自动调用析构函数释放资源。
结果:
Resource 构造函数
---> 使用资源
Resource 析构函数
useResource 函数执行完毕
3、QSharedPoint
a、示例一
#include <QSharedPointer>
#include <QScopedPointer>
#include <QDebug>
// 假设的图形对象类
class GraphicObject {
public:GraphicObject() { qDebug() << "GraphicObject created"; }~GraphicObject() { qDebug() << "GraphicObject destroyed"; }// 具体的图形对象操作
};
// 文档对象类
class Document {
public:Document() { qDebug() << "Document created"; }~Document() { qDebug() << "Document destroyed"; }// 添加图形对象到文档void addGraphicObject(QSharedPointer<GraphicObject> graphicObject) {graphicObjects.append(graphicObject);}// 具体的文档操作
private:QList<QSharedPointer<GraphicObject>> graphicObjects;
};
int main() {// 使用 QSharedPointer 确保图形对象的自动释放QSharedPointer<GraphicObject> graphicObject(new GraphicObject);// 使用 QScopedPointer 确保文档对象的自动释放QScopedPointer<Document> document(new Document);// 将图形对象添加到文档document->addGraphicObject(graphicObject);// 注意:在这里,graphicObject 和 document 会在适当的时候自动释放return 0;
}
b、示例二
#ifndef MYSHAREDCLASS_H
#define MYSHAREDCLASS_H
#include <QPointer>
#include <QDebug>
class MySharedClass : public QObject
{Q_OBJECTpublic:MySharedClass(int value): m_iValue(value){qDebug() << "MySharedClass 构造函数,值为:"<<m_iValue;}~MySharedClass(){qDebug() << "MySharedClass 析构函数,值为:"<<m_iValue;}void setValue(int value){m_iValue = value;}int getValue() const{return m_iValue;}private:QString m_name;int m_iValue;
};
#endif // MYSHAREDCLASS_H
void MainWindow::TestSharedPointer()
{//先用一个智能指针指向一个对象QSharedPointer<MySharedClass> pointer1(new MySharedClass(10));{//通过复制构造函数 让引用+1QSharedPointer<MySharedClass> pointer2 = pointer1;qDebug() << "---> pointer1 的值:"<<pointer1->getValue();qDebug() << "---> pointer2 的值"<<pointer2->getValue();//实际上都是对同一个对象进行操作pointer2->setValue(20);qDebug() << "--->w pointer1 的值:"<<pointer1->getValue();qDebug() << "--->w pointer2 的值"<<pointer2->getValue();}qDebug() << "--->w pointer1 的值:"<<pointer1->getValue();//之后,智能指针超出作用域之后,会自动析构掉
}
4、QWeakPoint
#ifndef MYWEAKCLASS_H
#define MYWEAKCLASS_H#include <QSharedPointer>
#include <QWeakPointer>
#include <QDebug>class ObjectB;class ObjectA
{
public:ObjectA(const QString& name) : m_name(name){}~ObjectA(){qDebug() << "objectA 析构函数,名称为:"<<m_name;}void setObjectB(const QSharedPointer<ObjectB> &objectB){m_objectB = objectB;}
private:QString m_name;QWeakPointer<ObjectB> m_objectB;
};class ObjectB
{
public:ObjectB(const QString& name): m_name(name){}~ObjectB(){qDebug() << "Object 析构函数,名称为:"<<m_name;}void setObjectA(const QSharedPointer<ObjectA> &objectA){m_objectA = objectA;}private:QString m_name;QSharedPointer<ObjectA> m_objectA;
};#endif // MYWEAKCLASS_H
void MainWindow::TestWeakPointer()
{QSharedPointer<ObjectA> objectA(new ObjectA("ObjectA"));QSharedPointer<ObjectB> objectB(new ObjectB("ObjectB"));objectA->setObjectB(objectB);objectB->setObjectA(objectA);qDebug() << "程序结束";
}
END、总结的知识与问题
参考
1、[Qt杂谈8.浅谈Qt智能指针那些事](https://www.cnblogs.com/luoxiang/p/17927569.html)
相关文章:
Qt——智能指针实战
目录 前言正文一、理论介绍1、QPointer2、QScopedPoint3、QSharedPoint4、QWeakPoint 二、实战演练1、QPoint2、QScopedPoint3、QSharedPointa、示例一b、示例二 4、QWeakPoint END、总结的知识与问题 参考 前言 智能指针的使用,对很多程序员来说,都算是…...

Unity Mobile Notifications推送问题
1.在部分机型点击通知弹窗进不去游戏 把这里改成自己的Activity 2.推送的时候没有横幅跟icon红点 主要是第一句话 注册的时候选项可以选择 defaultNotificationChannel new AndroidNotificationChannel(“default_channel”, “Default Channel”, “For Generic notifica…...

C++_回文串
目录 回文子串 最长回文子串 分割回文串 IV 分割回文串 II 最长回文子序列 让字符串成为回文串的最少插入次数 回文子串 647. 回文子串 思路,i j表示改范围内是否为回文串, ②倒着遍历是为了取出dp[i 1][j - 1] ③i j 只有一对,不会重复…...

【阅读论文】When Large Language Models Meet Vector Databases: A Survey
摘要 本调查探讨了大型语言模型(LLM)和向量数据库(VecDB)之间的协同潜力,这是一个新兴但迅速发展的研究领域。随着LLM的广泛应用,出现了许多挑战,包括产生虚构内容、知识过时、商业应用成本高昂…...

兼职副业大揭秘:六个潜力满满的赚钱途径
亲爱的朋友,你对兼职副业充满好奇与期待,这非常好!在此,我将为你分享一些能够助你赚取额外收入的兼职副业建议。以下是六个颇具潜力的兼职副业方向,希望能为你的探索之路提供些许启发。 1,网络调查与市场洞…...

C++ Qt开发:QUdpSocket实现组播通信
Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QUdpSocket组件实现基于UDP的组播通信…...

excel 表中有图片并在筛选特定行时,只显示该行的图片
建议:选中excel 表中某张图片,CtrlA,选中所有图片。再右键,在菜单中选设置对象格式 在属性里按下图设置, 生效之后,筛选某个产品的时候,就不会显示其他的不符合筛选条件的产品的图片了。...

【QA】MySQL多表查询详解
文章目录 前言关系型数据库中数据表之间的关系数据准备数据内容表间关系 基础查询 | 全部查询多表查询分类1 | 连接查询内连接外连接 | 左外连接外连接 | 右外连接自连接 | 自连接自连接 | 联合查询 分类2 | 子查询返回结果分类 | 标量子查询返回结果分类 | 列子查询返回结果分…...

【Entity Framework】 EF三种开发模式
【Entity Framework】 EF三种开发模式 文章目录 【Entity Framework】 EF三种开发模式一、概述二、DataBase First2.1 DataBase First简介2.2 DataBase First应用步骤2.3 DataBase First总结 三、Model First3.1 Model First简介3.2 Model First实现步骤 四、Code First4.1 Cod…...
数据分析---SQL(5)
目录 子查询单行子查询多行子查询视图(View)创建视图使用视图更新视图视图的优缺点存储过程存储过程的创建存储过程的参数存储过程的优缺点可能导致性能问题避免存储过程引入性能问题子查询 子查询是指在一个查询语句中嵌套另一个查询语句,内部的查询语句称为子查询,外部的…...

《剑指 Offer》专项突破版 - 面试题 93 : 最长斐波那契数列(C++ 实现)
题目链接:最长斐波那契数列 题目: 输入一个没有重复数字的单调递增的数组,数组中至少有 3 个数字,请问数组中最长的斐波那契数列的长度是多少?例如,如果输入的数组是 [1, 2, 3, 4, 5, 6, 7, 8]࿰…...

代码随想录算法训练营第五十五天|583. 两个字符串的删除操作、72. 编辑距离
583. 两个字符串的删除操作 刷题https://leetcode.cn/problems/delete-operation-for-two-strings/description/文章讲解https://programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html视频讲解https://…...
StringRedisTemplate Autowired注入为空解决
如下注入方式报空指针异常: java.lang.NullPointerException: null Autowiredprivate StringRedisTemplate redisTemplate; 解决办法:查看该类上有没有加注解,如Component等,没加的话加上。 还有一种是在工具类中使用,…...

c语言:文件操作
1. 为什么使⽤⽂件? 如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失 了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久…...

C#事件实例详解
一、什么是事件? 在C#中,事件(event)是一种特殊的类成员,它允许类或对象通知其他类或对象发生了某些事情。 从语法上看,事件的声明类似于字段,但它们在功能和行为上有一些重要的区别。 从技术角度来说,事件实际上是一个封装了事件订阅和取消订阅功能的委托字段。…...

零基础机器学习(3)之机器学习的一般过程
文章目录 一、机器学习一般过程1.数据获取2.特征提取3.数据预处理①去除唯一属性②缺失值处理A. 均值插补法B. 同类均值插补法 ③重复值处理④异常值⑤数据定量化 4.数据标准化①min-max标准化(归一化)②z-score标准化(规范化) 5.…...
用java做一个双色球彩票系统
代码如下: import java.util.Random; public class HelloWorld{public static void main(String[] args){//1、生成中奖号码 int[] arrcreateNumber();for (int i 0;i<arr.length;i) {System.out.print(arr[i]" ");}}public static int[] createNu…...

某对象存储元数据集群改造流水账
软件产品:某厂商提供的不便具名的对象存储产品,核心底层技术源自HDFS和Amazon S3,元数据集群采用了基于MongoDB的NOSQL数据库产品和MySQL数据库产品相结合。 该产品的元数据逻辑示意图如下: 业务集群现状:当前第3期建…...
前端理论总结(js)——filter、foearch、for in 、for of 、for的区别以及返回值
Filter: 用途:用于筛选数组中符合条件的元素,返回一个新数组。 返回值:返回一个新数组,包含经过筛选的元素。 Foreach: 用途:遍历数组中的每个元素,执行回调函数。 返回值&#x…...

【JavaEE初阶系列】——多线程案例一——单例模式 (“饿汉模式“和“懒汉模式“以及解决线程安全问题)
目录 🚩单例模式 🎈饿汉模式 🎈懒汉模式 ❗线程安全问题 📝加锁 📝执行效率提高 📝指令重排序 🍭总结 单例模式,非常经典的设计模式,也是一个重要的学科&#x…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...

STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...