一、weak_ptr简介

weak_ptr 辅助 shared_ptr 进行工作;
强指的就是 shared_ptr,弱指的就是 weak_ptr。
weak_ptr:也是个类模板,也是个智能指针,这个智能指针指向一个由 shared_ptr 管理的对象,但是 weak_ptr 这种指针不控制所指向对象的生命周期。
换句话来说,将 weak_ptr 绑定到 shared_ptr 上并不会改变 shared_ptr 的引用计数(更确切的说,weak_ptr 的构造和析构不会增加或减少所指向对象的引用计数)。
当 shared_ptr 需要释放所指定的时候照常释放,不管是否有 weak_ptr 指向该对象。
weak 这个意思 “弱” 能力弱(若共享/弱引用;共享其他的 shared_ptr 所指向的对象);控制不了所指向对象的生命周期。

这个弱引用( weak_ptr )的作用:大家可以理解成监视 shared_ptr (强引用)的生命周期用,是一种对 shared_ptr 能力的扩充。
weak_ptr 不是一种独立的智能指针,不能用来操作所指向的资源,所以它看起来像是一个shared_ptr 的助手。(旁观者)
weak_ptr 能够监视到它所指向的对象是否存在;

<1>weak_ptr创建
我们创建 weak_ptr 的时候,一般是用一个 shared_ptr 来初始化;

int main()
{auto pi = make_shared<int>(100);  //shared_ptrweak_ptr<int> piw(pi);  // piw弱共享pi,pi引用计数(强引用计数不会改变)不会改变,// 但是弱引用计数会改变(弱引用计数会从0变为1);return 0;
}

强引用计数才能决定对象的生存期,弱引用计数对对象生存期没有影响

int main()
{auto pi = make_shared<int>(100);  //shared_ptrweak_ptr<int> piw;piw = pi;  //pi是一个shared_ptr,赋值给一个weak_ptr,两者指向同一个内存对象;weak_ptr<int> piw2;piw2 = piw;  //把weak_ptr赋给另外一个weak_ptr,现在pi是一个强引用,piw和piw2是两个弱引用;weak_ptr<int> piw2(piw);return 0;
}

lock():功能就是检查weak_ptr所指向的对象是否存在,如果存在,那么这个lock他就能够返回一个指向该对象的shared_ptr
(指向对象的强引用计数加一)
如果所指向的对象不存在,lock返回一个空的shared_ptr

int main()
{auto pi = make_shared<int>(100);  //shared_ptrweak_ptr<int> piw;piw = pi;  //pi是一个shared_ptr,赋值给一个weak_ptr,两者指向同一个内存对象;weak_ptr<int> piw2;piw2 = piw;  //把weak_ptr赋给另外一个weak_ptr,现在pi是一个强引用,piw和piw2是两个弱引用;weak_ptr<int> piw2(piw);pi.reset();   // 因为pi是唯一指向该对象的强引用智能指针,所以reset()会释放pi所指向的对象,同时将pi置空auto pi2 = piw.lock();  //pi2是一个shared_ptrif (pi2 != nullptr)  //也可以写成if(pi2){//所指向的对象存在*pi2 = 12;}else{cout << "很遗憾,lock()失败" << endl;}return 0;
}

总结上面这段代码:weak_ptr 能够判断所指向的对象是否存在,这种能力。

二:weak_ptr常用操作

<1>use_count
获取与该弱指针所共享对象的其他 shared_ptr 的数量,或者说获得当前所观测资源的强引用计数;

int main()
{auto pi = make_shared<int>(100);auto pi2(pi);  //是一个shared_ptr;weak_ptr<int> piw(pi);auto piw2(piw);int isc = piw.use_count();cout << isc << endl;return 0;
}

<2>expired()
是否过期的意思,弱指针的 use_count() 返回0表示该弱指针所指向的对象已经不存在了,则返回true,否则返回false。
换句话说,这个函数用来判断所观测的资源是否被释放

int main()
{auto pi = make_shared<int>(100);auto pi2(pi);  //是一个shared_ptr;weak_ptr<int> piw(pi);auto piw2(piw);pi.reset();pi2.reset();if (piw.expired()){cout << "对象已经过期" << endl;}return 0;
}

<3>reset()
将该弱指针置为空,不会影响指向该对象的强引用数量,但指向该对象的弱引用数量会减少1。
piw.reset();

<4>lock()

int main()
{auto pi = make_shared<int>(100);auto pi2(pi);  //是一个shared_ptr;weak_ptr<int> piw(pi);auto piw2(piw);pi.reset();pi2.reset();weak_ptr<int> ptw;{auto p1 = make_shared<int>(100);ptw = p1;  //可以用shared_ptr给weak_ptr赋值}//ptw就会过期;if (!ptw.expired()){auto p2 = ptw.lock();  //返回一个shared_ptr, 并且此时强引用计数为2;if (p2 != nullptr){//做一些操作int test;test = 1;//离开这个范围,强引用计数,会恢复为1}}else{//已经过期int test;test = 1;}return 0;
}

走到这里,则强引用计数变回了1;

三:尺寸问题

weak_ptr pw;
weak_ptr和shared_ptr一样大,裸指针的2倍
int* p;
int ilen1 = sizeof§; //4个字节,是个裸指针
int ilen2 = sizeof(pw); //8个字节,两个裸指针

auto pi = make_shared(100); //后续还会继续讲解shared_ptr
weak_ptr piw(pi);

第一个裸指针指向的是这个智能指针所指向的对象;
第二个裸指针指向一个很大的数据结构(控制块),这个控制块里有:
1.所指对象的强引用计数
2.所指对象的弱引用计数
3.其他数据,比如自定义删除器的指针等等

总结: 基本具备能够读懂实战代码的能力。大家缺乏实战。

16.4 weak_ptr简介、weak_ptr常用操作与尺寸问题相关推荐

  1. weak_ptr概述,weak_ptr常用操作、尺寸

    一.weak_ptr概述:weak_ptr辅助shared_ptr进行工作 weak"弱",反义词"强" 强值得就是shared_ptr,弱指的就是weak_p ...

  2. Gnuplot的简介与常用操作

    Gnuplot 简介 ​ Gnuplot是一个命令行的交互式绘图工具(command-driven interactive function plotting program). ​ 用户通过输入命令 ...

  3. tableau入门简介和常用操作

    目录  1.tableau的介绍    1)tableau的优势    2)维度和指标    3)展现形式    4)设计形式    5)设计流程  2.数据导入.数据浏览  3.调整tableau中 ...

  4. python对excel操作简书_Python实现EXCEL常用操作——pandas简介

    知乎的代码块太丑了,这里的内容就更新到简书了Python实现EXCEL常用操作--pandas简介​www.jianshu.com EXCEL是日常办公最常用的软件,然而遇到数据量特别大(超过10W条 ...

  5. 16.3 shared_ptr常用操作、计数与自定义删除器等

    一:shared_ptr引用计数的增加和减少 共享式引用计数,每一个shared_ptr的拷贝都指向相同的内容(对象),只有最后一个指向该对象的shared_ptr指针不需要. 在指向该对象的时候,这 ...

  6. radare2 常用操作总结

    radare2 简介 radare2是一个用C语言编写的跨平台的二进制分析工具,支持ARM.MIPS.X86等平台,支持分析多种格式的二进制文件如ELF.Mach-O.Fatmach-O, PE.PE ...

  7. week9 day1 HTML简介和常用标签

    week9 day1 HTML简介和常用标签 一.前端内容介绍 二.HTML简介 2.1 HTML简介 2.2 HTML发展史 三.HTML标签与文档结构 3.1 HTML标签与文档结构 3.2 HT ...

  8. 【网络通信 -- 直播】FFMPEG 简介与常用命令总结

    [网络通信 -- 直播]FFMPEG 简介与常用命令总结 [1]FFMPEG 简介 FFmpeg,项目的名称来自 MPEG 视频编码标准,"FF"代表"Fast Forw ...

  9. mysql数据导库常用操作

    工作中经常遇到:一个数据库导入新的数据库实例中,或者一个数据库中的某些表导入新的数据库中,常用操作,总结一下. 部分数据表导入新库 单表导入新库的sql为 # CREATE TABLE 新表 SELE ...

  10. 1. python 字符串简介与常用函数

    1. python中的字符串简介与常用函数 在python中,字符串变成了一个强大的处理工具集,他是不可变的,也就是说字符串包含字符与字符的顺序,他不可以原处修改 字符串是我们后面需要学习的稍大一点的 ...

最新文章

  1. java点到直线的投影点到经纬度_12分高考答题必刷题型,“空间向量分析点到线的距离问题”...
  2. mysql流量控制_UDP流量控制之分析
  3. C# 中特性(Attribute)的使用简介
  4. activity 点击后传递数据给fragment_Fragment 的过去、现在和将来
  5. 能ping通工作组计算机 无法访问,可以ping通不能访问共享,其他电脑可以访问
  6. 案例分析:FICO如何从VMware迁移到OpenStack
  7. 系统性风险与个体性风险
  8. 编程中的那些容易迷糊的小知识
  9. Agglomerative Hierarchical Algorithms(凝聚式层次聚类)
  10. 带你全面了解Http和Https(开发人员必备)
  11. pb中的tounicode 函数_历年高考数学的必考热点三角函数,2020高考生,你会了吗?...
  12. GEO hash 核心原理
  13. php arcsin函数,三角函数计算器
  14. html代码大全字号,网页设计HTML代码大全
  15. php调京东联盟接口,使用京东联盟API获取自定义促销链接
  16. 60级高阶督军套装属性_魔兽世界60年代法师套装大解析,最经典实用的果然是灵风套装...
  17. c语言生成exe文件的作用,c语言怎么生成exe文件
  18. linux系统管理员基础
  19. 7-1 过河 (15 分)java版
  20. java-php-python-科技专业师生沟通平台计算机毕业设计

热门文章

  1. java size属性_Java中的长度length、length()、size()
  2. Learn C++学习笔记:第M章—最常用的智能指针:std::unique_ptr std::make_unique
  3. 小学三年级上册计算机计划书,小学生计划书
  4. 喜欢的现代诗 -。-
  5. 08. 微信公众号生成带参数二维码
  6. Java8 处理日期和时间
  7. 报告格式调整(自动生成目录、页码设置等)
  8. Think in Java 4 中关于使用XOM操作xml文件
  9. Raspberry Pi 上手准备
  10. 程序员眼中的中国传统文化-王阳明《传习录》16