Qt:智能指针QScopedPointer 的使用(以及如何写一个QScopedPointer )

前言

本文讲述QScopedPointer 的使用,以及自己如何写一个QScopedPointer .

正文

QScopedPointer 的常用方法

以下是 QScopedPointer 的一些常用方法及其详细说明:

  1. 构造函数

    • QScopedPointer<T> ptr(new T);
    • 用于创建一个 QScopedPointer,并管理一个新分配的对象。
  2. reset()

    • void reset(T *ptr = nullptr);
    • 释放当前管理的对象并重新指向新的对象。如果传入 nullptr,则仅释放当前管理的对象。
  3. operator->()

    • T *operator->() const;
    • 用于访问指针指向的对象的成员函数或变量。
  4. operator*()

    • T &operator*() const;
    • 用于访问指针指向的对象。
  5. T *data()

    • 返回指针指向的对象的裸指针。
  6. T *get() const noexcept

    • 功能:与 data() 功能相同,也返回当前 QScopedPointer 管理的对象的裸指针。
    • noexcept:表示该函数不会抛出异常。
    • 用法:通常与 data() 等效,可以使用 get() 方法来访问裸指针。
  7. bool isNull() const noexcept

    • 功能:检查 QScopedPointer 是否为空(即它是否指向一个有效的对象)。
    • noexcept:表示该函数不会抛出异常。
    • 用法:用于检查智能指针是否为空,常用于条件判断。
  8. T *take() noexcept

    • 功能:释放 QScopedPointer 管理的对象并返回裸指针,智能指针不再管理该对象。
    • noexcept:表示该函数不会抛出异常。
    • 用法:当你需要将对象的所有权转移到外部使用时,可以使用 take() 方法。调用 take() 后,智能指针不再管理该对象,因此外部代码需要负责删除它。
  9. void swap(QScopedPointer<T, Cleanup> &other) noexcept

    • 功能:交换当前 QScopedPointer 和另一个 QScopedPointer 的管理对象。
    • noexcept:表示该函数不会抛出异常。
    • 用法:用于交换两个 QScopedPointer 的对象,常用于实现自定义类型的 swap 操作或在算法中交换两个智能指针。

使用示例

// TestSmartPointer.h
#ifndef TESTSMARTPOINTER_H
#define TESTSMARTPOINTER_H#include <QObject>
#include <QScopedPointer>
#include <QSharedPointer>
class TestSmartPointer:public QObject
{Q_OBJECT
public:TestSmartPointer();~TestSmartPointer();void doSomething();
};#endif // TESTSMARTPOINTER_H// TestSmartPointer.cpp
#include "testsmartpointer.h"
#include <QDebug>
TestSmartPointer::TestSmartPointer()
{qDebug()<<"对象创建";
}TestSmartPointer::~TestSmartPointer()
{qDebug()<<"对象销毁";
}void TestSmartPointer::doSomething()
{qDebug()<<"其它处理逻辑";
}// main.cpp
#include <QCoreApplication>
#include "testsmartpointer.h"
#include "QDebug"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QScopedPointer<TestSmartPointer> smartPointer(new TestSmartPointer());smartPointer->doSomething();TestSmartPointer* tPointer = smartPointer.data();tPointer->doSomething();// 仅仅释放当前对象smartPointer.reset(nullptr);if (smartPointer.isNull()) {qDebug()<<"smartPointer is null";} else {qDebug()<<"smartPointer is not null";}QScopedPointer<TestSmartPointer> smartPointer2(new TestSmartPointer());if (smartPointer2.isNull()) {qDebug()<<"smartPointer2 is null";} else {qDebug()<<"smartPointer2 is not null";}// 智能指针不再管理该对象,需要自己管理TestSmartPointer* tPointer2 = smartPointer2.take();tPointer2->doSomething();delete tPointer2;return a.exec();
}
运行结果

在这里插入图片描述

实现类似 QScopedPointer 的智能指针

template <typename T>
class ScopedPointerSelf
{
public:// 构造函数explicit ScopedPointerSelf(T *ptr = nullptr) : m_ptr(ptr) {}// 析构函数~ScopedPointerSelf() {delete m_ptr;}// 禁止复制ScopedPointerSelf(const ScopedPointerSelf&) = delete;ScopedPointerSelf& operator=(const ScopedPointerSelf&) = delete;// 允许移动ScopedPointerSelf(ScopedPointerSelf&& other) noexcept : m_ptr(other.m_ptr) {other.m_ptr = nullptr;}ScopedPointerSelf& operator=(ScopedPointerSelf&& other) noexcept {if (this != &other) {delete m_ptr;m_ptr = other.m_ptr;other.m_ptr = nullptr;}return *this;}// 访问对象的方法T* operator->() const {return m_ptr;}// 解引用T& operator*() const {return *m_ptr;}bool operator!() const {return !m_ptr;}bool isNull() const {return !m_ptr;}// 重置指针void reset(T *ptr = nullptr) {delete m_ptr;m_ptr = ptr;}// 释放指针T* take() {T *temp = m_ptr;m_ptr = nullptr;return temp;}// 获取裸指针T* get() const {return m_ptr;}private:T *m_ptr;
};

解释

这里只是实现了一个简单的智能指针的功能,肯定和源码中的没法比,不过该有的功能也都有。

  1. 构造函数和析构函数:构造函数初始化指针,析构函数自动删除管理的对象。
  2. 禁用复制:禁用复制构造函数和赋值操作符,以防止不必要的对象复制。
  3. 移动构造函数和移动赋值操作符:允许移动构造和移动赋值,以便在移动时转移资源所有权。
  4. 重置和释放:提供 reset()take() 方法来管理指针的生命周期和获取裸指针。

使用

// 将我上述的内容放到testSmartPointer.h中,然后在main.cpp中
// 简单更改一下就能用了
#include <QCoreApplication>
#include "testsmartpointer.h"
#include "QDebug"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);ScopedPointerSelf<TestSmartPointer> smartPointer(new TestSmartPointer());smartPointer->doSomething();TestSmartPointer* tPointer = smartPointer.get();tPointer->doSomething();// 仅仅释放当前对象smartPointer.reset(nullptr);if (smartPointer.isNull()) {qDebug()<<"smartPointer is null";} else {qDebug()<<"smartPointer is not null";}ScopedPointerSelf<TestSmartPointer> smartPointer2(new TestSmartPointer());if (smartPointer2.isNull()) {qDebug()<<"smartPointer2 is null";} else {qDebug()<<"smartPointer2 is not null";}// 智能指针不再管理该对象,需要自己管理TestSmartPointer* tPointer2 = smartPointer2.take();tPointer2->doSomething();delete tPointer2;return a.exec();
}
运行结果

在这里插入图片描述

小结

请指教

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

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

相关文章

k8s环境配置

9.11 安装k8s 1、创建主机&#xff0c;设置ip&#xff0c;hostname,firewalld selinux, Networkmanage 2、设置主机之间的免密 编号主机名称IP1k8s-master192.168.1.142k8s-node1192.168.1.123k8s-node2192.168.1.13 3、yum源配置 四个源镜像 3、清空及建立缓存 4、主机…

LeetCode_sql_day28(1767.寻找没有被执行的任务对)

描述&#xff1a;1767.寻找没有被执行的任务对 表&#xff1a;Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

我的创作纪念日-20240919

何尝不是一种纪念。 话说&#xff0c;毕业之后和大学同学去深圳&#xff0c;后面回家考编制&#xff0c;现在在家里的中国邮政的代理金融网点上班。

【开放词汇检测】基于MMDetection的MM-Grounding-DINO实战

文章目录 摘要安装基础环境新建虚拟环境安装pytorch安装openmim、mmengine、mmcv安装 MMDetection验证安装配置OV-DINO环境 MMDetection的MM-Grounding-DINO详细介绍测试结果Zero-Shot COCO 结果与模型Zero-Shot LVIS ResultsZero-Shot ODinW&#xff08;野生环境下的目标检测&…

element-plus的菜单组件el-menu

菜单是几乎是每个管理系统的软件系统中不可或缺的&#xff0c;element-plus提供的菜单组件可以快速完成大部分的菜单的需求开发&#xff0c; 该组件内置和vue-router的集成&#xff0c;使用起来很方便。 主要组件如下 el-menu 顶级菜单组件 主要属性 mode:决定菜单的展示模式…

记录一下gitlab社区版的安装教程

目录 1.更新系统软件包 2.安装必要的依赖 3.添加GitLab源 3.1对于GitLab Enterprise Edition&#xff08;EE&#xff09;&#xff1a; 3.2对于GitLab Community Edition&#xff08;CE&#xff09;&#xff1a; 4.安装GitLab 4.1安装GitLab Enterprise Edition&#xff08;…

快人一步迅为LPDDR5版本瑞芯微RK3588核心板升级了

性能强--iTOP-3588开发板采用瑞芯微RK3588处理器&#xff0c;是全新一代ALoT高端应用芯片&#xff0c;采用8nm LP制程&#xff0c;搭载八核64位CPU&#xff0c;四核Cortex-A76和四核Cortex-A55架构&#xff0c;主频高达2.4GHZ&#xff0c;8GB内存&#xff0c;32GB EMMC。四核心…

PHP全程可视化防伪溯源一体化管理系统小程序源码

全程可视化&#xff0c;防伪溯源新篇章 —— 揭秘一体化管理系统的力量 &#x1f50d; 开篇&#xff1a;透视未来&#xff0c;从源头到终端的安心之旅 在这个信息透明化时代&#xff0c;每一件商品都承载着消费者的信任与期待。而“全程可视化防伪溯源一体化管理系统”&#x…

CleanClip for Mac 剪切板 粘贴工具 历史记录 安装(保姆级教程,新手小白轻松上手)

CleanClip&#xff1a;革新macOS剪贴板管理体验 目录 功能概览 多格式历史记录保存智能搜索功能快速复制操作拖拽功能 安装指南 前期准备安装步骤 配置与使用 功能概览 多格式历史记录保存 CleanClip支持保存文本、图片、文件等多种格式的复制历史记录&#xff0c;为用户提…

MySQL学习(存储过程)

文章目录 基本概念变量定义参数传递in: 传入参数out&#xff1a;传出参数inout&#xff1a;传入传出参数 流程控制if-elsecase: 类似Switch循环 游标&#xff08;cursor&#xff09;异常处理存储过程练习存储函数 基本概念 存储过程就是一组SQL语句集&#xff0c;实现一些比较…

GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions

GIS OGC之WMTS地图服务&#xff0c;通过Capabilities XML描述文档&#xff0c;获取matrixIds&#xff0c;origin&#xff0c;计算resolutions 需求&#xff1a;如何根据WMTS服务的Capabilities描述文档得到&#xff0c;openlayers调用wmts服务时的matrixIds&#xff0c;origin…

Qwen 2.5:阿里巴巴集团的新一代大型语言模型

Qwen 2.5&#xff1a;阿里巴巴集团的新一代大型语言模型 摘要&#xff1a; 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展日新月异&#xff0c;它们在自然语言处理&#xff08;NLP&#xff09;和多模态任务中扮演着越来越重要的角色。阿里巴巴集…

探索RESTful风格的网络请求:构建高效、可维护的API接口【后端 20】

探索RESTful风格的网络请求&#xff1a;构建高效、可维护的API接口 在当今的软件开发领域&#xff0c;RESTful&#xff08;Representational State Transfer&#xff09;风格的网络请求已经成为构建Web服务和API接口的标配。RESTful风格以其简洁、无状态、可缓存以及分层系统等…

[数据集][目标检测]俯拍航拍森林火灾检测数据集VOC+YOLO格式6116张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6116 标注数量(xml文件个数)&#xff1a;6116 标注数量(txt文件个数)&#xff1a;6116 标注…

pg入门2—pg中的database和schema有什么区别

在 PostgreSQL&#xff08;简称 PG&#xff09;和 MySQL 中&#xff0c;Database 和 Schema 是两个不同层次的概念&#xff0c;而在 MySQL 中&#xff0c;Database 和 Schema 常常被混用。通过结合这两种数据库的设计&#xff0c;我们可以更清晰地理解它们之间的区别。 1. Pos…

神经网络通俗理解学习笔记(0) numpy、matplotlib

Numpy numpynumpy 基本介绍Ndarray对象及其创建Numpy数组的基础索引numpy数组的合并与拆分&#xff08;重要&#xff09;numpy数组的矩阵运算Numpy数组的统计运算numpy中的arg运算numpy中的神奇索引和比较 Matplotlib numpy numpy 基本介绍 numpy 大多数机器学习库都用了这个…

下载github patch到本地

以下是几种从 GitHub 上下载以.patch 结尾的补丁文件的方法&#xff1a; 通过浏览器直接下载 打开包含该.patch 文件的 GitHub 仓库。在仓库的文件列表中找到对应的.patch 文件。点击该文件&#xff0c;浏览器会显示文件的内容&#xff0c;在页面的右上角通常会有一个“Raw”…

MyBatis - 一对多对象关联查询

作者&#xff1a;fyupeng 技术专栏&#xff1a;☞ https://github.com/fyupeng 项目地址&#xff1a;☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 一、介绍 比如你需要在Company对象中&#xff0c;嵌套列表SonCompanys和ContactInfos&#xff0c;而且…

视频监控平台是如何运作的?EasyCVR视频汇聚平台的高效策略与实践

随着科技的飞速发展&#xff0c;视频监控平台在社会安全、企业管理、智慧城市构建等领域发挥着越来越重要的作用。一个高效的视频监控平台&#xff0c;不仅依赖于先进的硬件设备&#xff0c;更离不开强大的视频处理技术作为支撑。这些平台集成了多种先进的视频技术&#xff0c;…

Python 如何封装工具类方法,以及使用md5加密

第一步&#xff1a;封装使用方法 在utils目录中&#xff0c;编写我的md5加密的方法&#xff0c;如下&#xff1a; import re import hashlib from os import path from typing import Callable from flask import current_app# 这里封装的是工具类的方法def basename(filenam…