c++ wake_ptr智能指针

转载自c语言中文网

在 C++98/03 的基础上,C++11 标准新引入了 shared_ptr、unique_ptr 以及 weak_ptr 这 3 个智能指针。其中,shared_ptr 和 unique_ptr 已经在前面章节做了详细地介绍,本节重点讲解 weak_ptr 智能指针的特性和用法。

注意学习 weak_ptr 智能指针之前,读者必须对 shared_ptr 智能指针有一定的了解,可阅读《C++11 shared_ptr智能指针》一节;关于 unique_ptr 指针,读者可阅读《C++11 unique_ptr智能指针》一节做系统学习。

C++11 weak_ptr智能指针

和 shared_ptr、unique_ptr 类型指针一样,weak_ptr 智能指针也是以模板类的方式实现的。weak_ptr( T 为指针所指数据的类型)定义在<memory>头文件,并位于 std 命名空间中。因此,要想使用 weak_ptr 类型指针,程序中应首先包含如下 2 条语句:

#include <memory>using namespace std;

第 2 句并不是必须的,可以不添加,则后续在使用 unique_ptr 指针时,必须标注std::

需要注意的是,C++11标准虽然将 weak_ptr 定位为智能指针的一种,但该类型指针通常不单独使用(没有实际用处),只能和 shared_ptr 类型指针搭配使用。甚至于,我们可以将 weak_ptr 类型指针视为 shared_ptr 指针的一种辅助工具,借助 weak_ptr 类型指针, 我们可以获取 shared_ptr 指针的一些状态信息,比如有多少指向相同的 shared_ptr 指针、shared_ptr 指针指向的堆内存是否已经被释放等等。

需要注意的是,当 weak_ptr 类型指针的指向和某一 shared_ptr 指针相同时,weak_ptr 指针并不会使所指堆内存的引用计数加 1;同样,当 weak_ptr 指针被释放时,之前所指堆内存的引用计数也不会因此而减 1。也就是说,weak_ptr 类型指针并不会影响所指堆内存空间的引用计数。

除此之外,weak_ptr 模板类中没有重载 * 和 -> 运算符,这也就意味着,weak_ptr 类型指针只能访问所指的堆内存,而无法修改它。

1、weak_ptr指针的创建

创建一个 weak_ptr 指针,有以下 3 种方式:

  1. 可以创建一个空 weak_ptr 指针,例如:
std::weak_ptr<int> wp1;
  1. 凭借已有的 weak_ptr 指针,可以创建一个新的 weak_ptr 指针,例如:
std::weak_ptr<int> wp2 (wp1);

若 wp1 为空指针,则 wp2 也为空指针;反之,如果 wp1 指向某一 shared_ptr 指针拥有的堆内存,则 wp2 也指向该块存储空间(可以访问,但无所有权)。

  1. weak_ptr 指针更常用于指向某一 shared_ptr 指针拥有的堆内存,因为在构建 weak_ptr 指针对象时,可以利用已有的 shared_ptr 指针为其初始化。例如:
std::shared_ptr<int> sp (new int);
std::weak_ptr<int> wp3 (sp);

由此,wp3 指针和 sp 指针有相同的指针。再次强调,weak_ptr 类型指针不会导致堆内存空间的引用计数增加或减少。

2) weak_ptr模板类提供的成员方法

和 shared_ptr、unique_ptr 相比,weak_ptr 模板类提供的成员方法不多,表 1 罗列了常用的成员方法及各自的功能。

成员方法功 能
operator=()重载 = 赋值运算符,是的 weak_ptr 指针可以直接被 weak_ptr 或者 shared_ptr 类型指针赋值。
swap(x)其中 x 表示一个同类型的 weak_ptr 类型指针,该函数可以互换 2 个同类型 weak_ptr 指针的内容。
reset()将当前 weak_ptr 指针置为空指针。
use_count()查看指向和当前 weak_ptr 指针相同的 shared_ptr 指针的数量。
expired()判断当前 weak_ptr 指针为否过期(指针为空,或者指向的堆内存已经被释放)。
lock()如果当前 weak_ptr 已经过期,则该函数会返回一个空的 shared_ptr 指针;反之,该函数返回一个和当前 weak_ptr 指向相同的 shared_ptr 指针。

再次强调,weak_ptr 模板类没有重载 * 和 -> 运算符,因此 weak_ptr 类型指针只能访问某一 shared_ptr 指针指向的堆内存空间,无法对其进行修改。

下面的样例演示了 weak_ptr 指针以及表 1 中部分成员方法的基本用法:

#include <iostream>
#include <memory>
using namespace std;
int main()
{std::shared_ptr<int> sp1(new int(10));std::shared_ptr<int> sp2(sp1);std::weak_ptr<int> wp(sp2);//输出和 wp 同指向的 shared_ptr 类型指针的数量cout << wp.use_count() << endl;//释放 sp2sp2.reset();cout << wp.use_count() << endl;//借助 lock() 函数,返回一个和 wp 同指向的 shared_ptr 类型指针,获取其存储的数据cout << *(wp.lock()) << endl;return 0;
}

程序执行结果为:

2
1
10

有关表 1 中其它成员函数的用法,感兴趣的读者可直接查看 weak_ptr 官网。

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

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

相关文章

springMVC-数据格式化

1、基本介绍 在一个springmvc项目中&#xff0c;当表单提交数据时&#xff0c;如何对表单提交的数据进行格式的转换呢&#xff1f; 只要是数据进行网络传输都是以字符串的形式&#xff0c;进入内存后才有数据类型。 springmvc在上下文环境内置了一些转换器&#xff0c…

【MyBatis-Plus】常用的内置接口

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于MyBatis-Plus的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 1.Service接口 1.1.Save 1.2.Sa…

leetcode每日一题打卡

leetcode每日一题 746.使用最小花费爬楼梯162.寻找峰值1901.寻找峰值Ⅱ 从2023年12月17日开始打卡~持续更新 746.使用最小花费爬楼梯 2023/12/17 代码 解法一 class Solution {public int minCostClimbingStairs(int[] cost) {int n cost.length;int[] dp new int[n1];dp[…

C51--小车——PWM调速

如何进行小车PWM调速&#xff1a; 原理&#xff1a; 全速前进&#xff1a;LeftCon1A 0&#xff1b;LeftCon1B 1&#xff1b; 完全停止&#xff1a;LeftCon1A 0&#xff1b;LeftCon1B 0&#xff1b;单位时间内&#xff0c;例如20ms&#xff0c;有15ms是全速&#xff0c;5m…

【牛客网】编程题:找到无序数组中最小的k个数(146)

[编程题]&#xff1a;找到无序数组中最小的k个数 热度指数&#xff1a;2394时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒空间限制&#xff1a;C/C 256M&#xff0c;其他语言512M 算法知识视频讲解 给定一个整型数组arr&#xff0c;找到其中最小的k个数。 输入描述: 输…

Linux常用基本命令操作

目录 一、认识shell 1、什么是shell 2、命令的本质 3、内部命令和外部命令 4、harsh缓存 5、命令执行的过程 6、如果打了一个命令&#xff0c;提示该命令不存在 7、命令提示符 8、Linux系统文件夹 二、Linux常用命令 1、通用Linux命令行格式 2、编辑Linux命令行的辅…

Spring Boot + MinIO 实现文件切片极速上传技术

文章目录 1. 引言2. 文件切片上传简介3. 技术选型3.1 Spring Boot3.2 MinIO 4. 搭建Spring Boot项目5. 集成MinIO5.1 配置MinIO连接信息5.2 MinIO配置类 6. 文件切片上传实现6.1 控制器层6.2 服务层6.3 文件切片上传逻辑 7. 文件合并逻辑8. 页面展示9. 性能优化与拓展9.1 性能优…

qt源码链接C++automic

qaction.cpp source code [qtbase/src/widgets/kernel/qaction.cpp] - Codebrowser C原子变量atomic详解 - 知乎 (zhihu.com)

[C++ 从入门到精通] 15.友元函数、友元类、友元成员函数

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

统计分析绘图软件 GraphPad Prism 10 mac功能介绍

GraphPad Prism mac是一款专业的统计和绘图软件&#xff0c;主要用于生物医学研究、实验设计和数据分析。 GraphPad Prism mac功能和特点 数据导入和整理&#xff1a;GraphPad Prism 可以导入各种数据格式&#xff0c;并提供直观的界面用于整理、编辑和管理数据。用户可以轻松地…

qsort函数应用

1.引入 我们前面学习了一些常见的排序方法&#xff0c;比如冒泡排序等&#xff0c;但它仅局限于整型的排序&#xff0c;今天我们要介绍一个牛气哄哄的库函数qsort函数&#xff0c;这个函数可就厉害了&#xff0c;能排序任意类型数据&#xff0c;掌握后可谓受益终身&#xff0c;…

PyQt中的冒号(:)

在这段代码中&#xff0c;冒号&#xff08;:&#xff09;的使用是类型注解的一种形式&#xff0c;用于显式地指定变量的类型。在Python 3.5及以后的版本中&#xff0c;引入了类型注解的概念&#xff0c;可以在变量名后面使用冒号来注解变量的类型。 例如&#xff0c;在以下代码…

Python 安装第三方模块

要安装三方模块&#xff0c;需要知道模块的名字和pip。 pip来源&#xff1a; Mac、Linux无需安装自带。 Window:勾选了pip和add python.exe to Path 目录 安装Pillow 查看pip版本 命令行安装 查看本地安装库 升级pip 使用Pillow 引入三方库 打开图片 查看图片的信息 …

Metashape 自定义比例尺 / 无POS时如何制作DEM

前言操作步骤 前言 Metashape 自定义比例尺 和 无POS时如何制作DEM&#xff0c;此二者的操作步骤本质上是一样的。 当我们输入的照片没有POS&#xff0c;且没有做像控点的时候&#xff0c;比如我们仅仅拍摄了一个比较小的物体&#xff0c;可能是一瓶饮料或者一个椅子。 那么此…

C++刷题 -- KMP算法

C刷题 – KMP算法 文章目录 C刷题 -- KMP算法1.算法讲解2.算法实现 https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/ 1.算法讲解 KMP算法是一种字符串匹配算法&#xff0c;当出现字符串不匹配时&#xff0c;可以记录一部分之…

【>D:\10\Debug\RCa00828(34): fatal error RC1022: expected ‘#endif‘】

1>D:\10\Debug\RCa00828(34): fatal error RC1022: expected ‘#endif’ The error message you’re seeing, fatal error RC1022: expected ‘#endif’, indicates that the resource compiler encountered an issue when processing a resource script file (typically w…

【CLion】使用CLion开发STM32

本文主要记录使用CLion开发STM32&#xff0c;并调试相关功能 使用的CLion版本&#xff1a;2023.3.1 CLion嵌入式配置教程&#xff1a;STM32CubeMX项目 |CLion 文档 (jetbrains.com) OpenOCD官网下载&#xff1a;Download OpenOCD for Windows (gnutoolchains.com) GNU ARM工…

大话前端:WebAssembly的未来与前端开发

大话前端&#xff1a;WebAssembly的未来与前端开发 引言 近年来&#xff0c;WebAssembly&#xff08;简称Wasm&#xff09;作为一种新兴的网络技术&#xff0c;正在逐步改变前端开发的格局。作为一种低级的类汇编语言&#xff0c;它允许代码以接近原生的速度运行&#xff0c;…

lv12 linux 内核移植 10

目录 1 内核概述 1.1 内核与操作系统 1.2 Linux层次结构 1.3 Linux内核特点 2 Linux内核源码结构 2.1 Linux内核源码获取 2.2 源码结构 3 Linux内核移植 3.1 在 Linux 官网下载 Linux 内核源码&#xff08;这里我们下载 linux-3.14.tar.xz&#xff09; 3.2 拷贝内核源…

React中对UI组件化的步骤和设计原理

在 React 中&#xff0c;对 UI 进行组件化是一个将复杂界面拆分成更小、独立和可复用部分的过程。这种方法有助于提高应用的可维护性、可测试性&#xff0c;并且可以提升开发效率。下面是 React 中对 UI 组件化的步骤和设计原理的详细解释&#xff1a; 步骤一&#xff1a;识别…