智能指针之weak_ptr06

2023-11-08

一 weak_ptr

看名字就知道,他是一个弱引用,他的存在是为了辅助shared_ptr的循环引用问题,它不占用引用数。只能通过shared_ptr或者weak_ptr构造赋值。
它没有重载 * 和 -> 运算符,因此不可以直接通过 weak_ptr 访问对象,典型的用法是通过 lock() 成员函数来获得 shared_ptr,进而使用对象。
大家理解时,将weak_ptr看成用来监视shared_ptr(强引用)的生命周期用。是一种对shared_ptr的扩充。

1 weak_ptr初始化赋值

    //1 weak_ptr初始化赋值
    std::shared_ptr<int> sh = std::make_shared<int>();  // 默认值为0
    cout<<sh.use_count()<<endl;                         // 1
    std::weak_ptr<int> w(sh);                           // 用shared_ptr构造
    std::weak_ptr<int> w1(w);                           // 用weak_ptr构造
    cout<<sh.use_count()<<endl;                         // 1

    std::weak_ptr<int> w2=sh;                           // 用shared_ptr赋值
    std::weak_ptr<int> w3=w2;                           // 用weak_ptr赋值
    cout<<sh.use_count()<<endl;                         // 1

2 lock()函数

lock():检查weak_ptr所指向的对象是否存在,如果存在那么lock将返回一个指向该对象的shared_ptr(指向对象的强引用就会+1),如果指向对象不存在,lock会返回一个空的shared_ptr。通过lock可以将weak_ptr转化成shared_ptr使用。
例子看下面。

3 expired()函数

expired函数:判断weak_ptr的方法expired判断shared_ptr管理的资源是否已经释放。true已释放,0未释放。

4 上面1,2,3大点的案例

注释已经标明清楚。

//4 weak_ptr  --小弟
void test16(){

    //1 weak_ptr初始化赋值
    std::shared_ptr<int> sh = std::make_shared<int>();  // 默认值为0
    cout<<sh.use_count()<<endl;                         // 1
    std::weak_ptr<int> w(sh);                           // 用shared_ptr构造
    std::weak_ptr<int> w1(w);                           // 用weak_ptr构造
    cout<<sh.use_count()<<endl;                         // 1

    std::weak_ptr<int> w2=sh;                           // 用shared_ptr赋值
    std::weak_ptr<int> w3=w2;                           // 用weak_ptr赋值
    cout<<sh.use_count()<<endl;                         // 1

    /*
        2. lock函数:检查weak_ptr所指向的对象是否存在,
        如果存在那么lock将返回一个指向该对象的shared_ptr(指向对象的强引用就会+1),
        如果指向对象不存在,lock会返回一个空的shared_ptr.
        通过lock可以将weak_ptr转化成shared_ptr使用
    */
    std::shared_ptr<int> another = w2.lock();  
    if (another != nullptr){
        *another = 12;
        cout<<"sh管理的内存未被释放"<<endl;
    }
    cout<<sh.use_count()<<endl;                         // 2

    //3 expired函数:判断weak_ptr的方法expired判断shared_ptr管理的资源是否已经释放。true已释放,0未释放
    bool isDeleted = w2.expired();
    cout<<sh.use_count()<<endl;                         // 2
    cout<<isDeleted<<endl;                              // 0 因为程序还没结束 sh与another在引用 
    
    //测试lock为空时
    another.reset();//无参reset置空,该内存引用数减1,本对象another的引用计数为0
    sh.reset();
    if (w2.lock() == nullptr){
        cout<<"sh管理的内存被释放"<<endl;
    }
}

结果:
在这里插入图片描述

注意,在shared_ptr之前我们已经说过了reset的使用,这里再简单说明一下。
reset():将该引用的引用计数设置为空,不影响该片内存的引用计数,但是该片内存的引用计数会减少1。

5 尺寸问题

weak_ptr与shared_ptr的尺寸一样大,是裸指针的两倍。内部有两个裸指针。
在这里插入图片描述

  • 1)第一个裸指针指向的是这个智能指针所指向的对象。
  • 2)第二个所指针指向一个数据结构(控制块),这个控制块里有:
    1、引用计数(强引用计数、弱引用计数)
    2、其他数据(弱引用删除器,互斥锁等等)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

智能指针之weak_ptr06 的相关文章

随机推荐

  • 使用 React Hooks + mock + antd构建一个完整且漂亮的 todoList

    实现效果 搭建项目 使用 create react app 快速创建一个项目 删除不必要的文件 保留文件如下 目录说明 index js 项目入口文件 index less 样式 mock js 模拟 todo 数据 TodoList js
  • 6基于二阶锥规划的主动配电网最优潮流求解

    matlab代码 6 基于二阶锥规划的主动配电网最优潮流求解 参考文献 主动配电网多源协同运行优化研究 乔珊 摘要 最优潮流研究在配 电网规划运行 中不可或缺 且在大量分布式能源接入 的主动配 电网环境下尤 为重要 传统的启发式算法 在全局
  • statsmodels.regression.linear_model.RegressionResults

    statsmodels regression linear model RegressionResults class statsmodels regression linear model RegressionResults model
  • vue上传文件夹,将file类型转为binary类型传参到后台

  • ES6-promise小技巧

    Promise all 从Promise all返回的主promise在所有成员promise都完成后才会执行 如果这些promise中有任何一个被拒绝 reject error 住promise就会被拒绝 并丢弃来自其他所有promise
  • 【Jupyter Notebook】安装及使用

    知识目录 前言 一 Jupyter Notebook安装使用 1 1 Jupyter Notebook的三种打开方式 1 点击Anaconda Prompt打开 2 点击Jupyter Notebook打开 3 使用Powershell打开
  • [计算机毕业设计]机器学习的数据驱动股票价格预测

    前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大
  • 算法设计与分析——0/1背包问题

    问题描述 给定n个重量为 w1 w2 wn 价值为 v1 v2 vn 的物品和一个容量为C的背包 0 1背包问题是求这些物品中的一个 最有价值的子集 并且能够装入背包中 基本算法思想 暴力法 用暴力法解决0 1背包问题 需要考虑给定n个物品
  • 概率密度函数

    概率密度函数 Probability Density Function 简称PDF 是描述随机变量的概率分布的函数 它对于连续型随机变量来说是非常重要的概念 PDF可以用来描述变量在不同取值上的概率分布情况 对于一个连续型随机变量X 其概率
  • 记忆化搜索 (蒟蒻练习生)

    定义 记忆化搜索是一种通过记录已经遍历过的状态的信息 从而避免对同一状态重复遍历的搜索实现方式 因为记忆化搜索确保了每个状态只访问一次 它也是一种常见的动态规划实现方式 引入 题目见 NOIP2005 采药 朴素的 DFS 做法 很容易实现
  • Python web自动化测试 —— 文件上传

    文件上传三种方式 一 查看元素标签 如果是input 则可以参照文本框输入的形式进行文件上传 方法 和用户输入是一样的 使用send keys 1 2 3 4 5 步骤 1 找到定位元素 2 输入文件路径 ele driver find e
  • ios android 字体大小,并排文字在ios上字体变大,安卓上正常显示

    IOS页面 安卓页面 复现代码 公告 疑情公告 notice notice export default data return notice 中民筑友码垛机作业区域一号工位发 疑似闯入行为中民筑友码垛机作业区域一号工位发 疑似闯入行为 发
  • Golang中结构体Struct

    前言 这里总结的Golang 笔记只适合有点编程基础的人看 比如Java 往期内容 Golang学习 day1 变量 类型 Golang学习 指针 循环控制相关 循环结构控制 包函数的使用 异常处理 数组 老奶奶可以看懂的切片 老奶奶可以看
  • C++之extern和static用法和区别

    目录 声明和定义的区别 关键字extern 作用 用法总结 关键字static 全局变量和全局静态变量区别 局部静态变量 静态函数 声明和定义的区别 变量定义 用于为变量分配存储空间 还可为变量指定初始值 程序中 变量有且仅有一个定义 变量
  • C语言读取写入CSV文件基础入门篇

    什么是CSV 大量C语言项目课设 小游戏源码 压 缩 包 免 费 下 载 链 接 如 下 c语言项目课设小游戏源码资料压缩包 zip C文档类资源 CSDN下载c语言项目课设小游戏源码资料压缩包 zipc语言项目课设小游戏源码资料压缩包 z
  • 数据驱动的数字化转型:从流程驱动到数据驱动

    以下文章来源于凯哥讲故事系列 作者凯哥 数字化时代已经到来 1996年的时候 Being Digital 的作者Negroponte就提出数字化生活的概念 而20年以后的今天 我们已经进入了数字化的生活 移动互联网 物联网 手机 各种社交媒
  • 刷脸支付无一例外地建构与完善起来

    刷脸支付均采用的是3D人脸识别技术 这种技术具有一项至关重要的功能 活体检测 即系统摄像头在识别人脸是否为本人的同时 还能检验是否有人利用照片等手段冒充用户 由此封闭了假体攻击的空间 正如支付工具的迭代总是高出人们的预估一样 技术的进化对于
  • 小程序配置网络请求@escook/request-miniprogram

    由于平台限制 小程序项目不支持axios 原生wx request API功能较为简单 不支持拦截器等功能 所以使用 escook request miniprogram第三方包发起网络数据请求 配置步骤 官方文档 https www np
  • 浅谈.NET语言开发应用领域

    NET语言是一种跨平台的开发框架 适用于各种应用程序的开发 以下是一些常见的 NET语言开发应用领域 桌面应用程序开发 使用 NET框架开发的桌面应用程序可以在Windows操作系统上运行 包括Windows Forms和WPF 这些应用程
  • 智能指针之weak_ptr06

    一 weak ptr 看名字就知道 他是一个弱引用 他的存在是为了辅助shared ptr的循环引用问题 它不占用引用数 只能通过shared ptr或者weak ptr构造赋值 它没有重载 和 gt 运算符 因此不可以直接通过 weak