本文转载于http://c.biancheng.net/view/7918.html
  在C++98/03的基础上,C++11新标准引入了shared_ptrunique_ptr以及weak_ptr这3个智能指针。本文介绍weak_ptr智能指针的特性和用法。
  和shared_ptr以及unique_ptr类型指针一样,weak_ptr智能指针也是以模板类的方式实现的。weak_ptr<T>(T为指针所指数据的类型)定义在<memory>头文件,并位于std命名空间中。因此,要想使用weak_ptr类型指针,程序中应首先包含以下2条语句:

#include <iostream> 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<T>模板类中没有重载*->运算符,这也就意味着,weak_ptr类型指针只能访问所指的堆内存,而无法修改它。

1 weak_ptr指针的创建

  创建一个weak_ptr指针,有以下3种方式:
(1)可以创建一个空的weak_ptr指针,例如:

std::weak_ptr<int> wp1; 

(2)凭借已有的weak_ptr指针,可以创建一个新的weak_ptr指针,例如:

std::weak_ptr<int> wp2(wp1); 

wp1为空指针,则wp2也为空指针;反之,如果wp1指向某一shared_ptr指针拥有的堆内存,则wp2也指向该块存储空间(可以访问,但无所有权)。
(3)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<T>以及unique_ptr<T>相比,weak_ptr<T>模板类提供的成员方法不多,下表罗列了常用的成员方法及各自的功能。

成员方法 功能
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<T>模板类没有重载*->运算符,因此weak_ptr类型指针只能访问某一shared_ptr指针指向的堆内存空间,无法对其进行修改。
  下面的样例演示了weak_ptr指针以及上表中部分成员方法的基本用法:

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

程序执行结果为:

2 1 10 

热门文章

3月13日更新18.5M/S,2025年最新高速SSR/Shadowrocket/Clash/V2ray订阅链接免费节点地址分享

这一次的节点更新覆盖了美国、韩国、欧洲、香港、新加坡、加拿大、日本等地区,最高速度可达18.5 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。

宠物店领养宠物多少钱一天啊(宠物店领养宠物要钱吗)

摘要: 本篇文章给大家谈谈宠物店领养宠物多少钱一天啊,以及宠物店领养宠物要钱吗对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、把狗狗放到宠物店寄养大概是多少钱一..

3月20日更新20.9M/S,2025年最新高速Clash/V2ray/Shadowrocket/SSR订阅链接免费节点地址分享

这一次的节点更新覆盖了香港、新加坡、韩国、欧洲、日本、美国、加拿大等地区,最高速度可达20.9 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。

宠物粮食代加工骗局案例 宠物粮食代加工骗局案例分析

摘要: 大家好,今天小编关注到一个比较有意思的话题,就是关于宠物粮食代加工骗局案例的问题,于是小编就整理了4个相关介绍宠物粮食代加工骗局案例的解答,让我们一起看看吧。文明重启加工宠物粮食怎

动物接种疫苗后多久产生特异性抗体? 动物接种疫苗后多久产生特异性抗体呢

摘要: 大家好,今天小编关注到一个比较有意思的话题,就是关于动物接种疫苗后多久产生特异性抗体?的问题,于是小编就整理了2个相关介绍动物接种疫苗后多久产生特异性抗体?的解答,让我们一起看看吧

孕妇被猫抓伤出一丝丝血要***吗(孕妇被猫抓伤出一丝丝血要***吗有影响吗)

摘要: 本篇文章给大家谈谈孕妇被猫抓伤出一丝丝血要打针吗,以及孕妇被猫抓伤出一丝丝血要打针吗有影响吗对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、孕妇被小猫抓..

动物疫苗知识大全图片(动物疫苗的了解)

摘要: 今天给各位分享动物疫苗知识大全图片的知识,其中也会对动物疫苗的了解进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、狗狗打的预防针,国产的跟.

@NotEmpty、@NotBlank等注解的正确使用 @Validated和@Valid的区别 解决@NotBlank等注解不生效的问题 使用BindingResult进行接口请求参数的统一校验

文章目录 1. 问题说明 2. 配置依赖 3. 编写注解的bean 4. 常用注解说明 4.1 空检查 4.2 布尔检查 4.3 长度检查 4.4 日期检查 4.5 数值检查 5. 编写co

制作狗粮机器多少钱一套(自制狗粮机)

摘要: 本篇文章给大家谈谈制作狗粮机器多少钱一套,以及自制狗粮机对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、火腿肠加工机器多少钱2、... 本篇文

windows下安装redis_在线工具

一、安装redis 下载地址: https://github.com/MicrosoftArchive/redis/releases Redis 支持 32 位和 64 位。这个需要根据你系统平台的实

归纳