当前位置: 首页 > news >正文

weak_ptr是怎么探知对象生死的

weak_ptr是C++智能指针中的一种。它用于解决共享所有权的问题,并且可以避免因循环引用而导致的内存泄漏。

weak_ptr本身并不承担对象的所有权,它指向由shared_ptr管理的对象。与shared_ptr不同,weak_ptr并不会增加计数器来计算对象的引用次数。因此,当所有shared_ptr释放后,即使还有相关的weak_ptr存在,也无法访问对象。为了判断对象是否仍然存在,weak_ptr提供了一个方法来检查其所指向的对象是否有效。

使用weak_ptr探知对象是否存活的方法如下:

  1. 创建weak_ptr对象:通过shared_ptr创建一个weak_ptr对象,将其绑定到所管理的对象上。
std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);
std::weak_ptr<int> weakPtr(sharedPtr);

在上述示例中,我们使用shared_ptr管理一个整数对象,并通过weak_ptr创建一个弱引用。

  1. 检查对象是否有效:可以使用expired()成员函数来检查weak_ptr所指向的对象是否仍然有效。如果返回值为true,则表示对象已经被释放,不再可用;如果返回值为false,则表示对象仍然有效。
if (weakPtr.expired()) {// 对象已经被释放
} else {// 对象仍然有效
}
  1. 锁定weak_ptr:如果希望访问weak_ptr所指向的对象,可以使用lock()成员函数来获取一个指向对象的shared_ptr。如果对象已经被释放,则返回一个空的shared_ptr
std::shared_ptr<int> sharedPtr = weakPtr.lock();
if (sharedPtr) {// 通过 sharedPtr 访问对象
} else {// 对象已经被释放
}

在上述示例中,我们通过lock()函数尝试获取一个shared_ptr来访问对象。如果对象已经被释放,则返回一个空的shared_ptr,否则返回一个有效的shared_ptr

需要注意的是,由于weak_ptr不会增加引用计数,因此不能直接使用weak_ptr来访问对象。需要将其转换为shared_ptr,以确保对象在使用期间不会被意外释放。

通过以上方法,我们可以使用weak_ptr来探知对象是否存活,并避免悬空指针的风险。这在处理缓存、观察者模式等场景下特别有用。

下面是陈硕书中的demo
在这里插入图片描述

http://www.lryc.cn/news/141673.html

相关文章:

  • ⌈算法进阶⌋图论::拓扑排序(Topological Sorting)——快速理解到熟练运用
  • 【Python】【数据结构和算法】保留最后N个元素
  • wireshark 基本使用
  • 2、结构型设计模式
  • JavaScript下载excel文件
  • 研磨设计模式day12命令模式
  • 设计模式 06 适配器模式
  • UE4/5Niagara粒子特效之Niagara_Particles官方案例:3.3->4.3
  • 数据结构队列的实现
  • Gti的基本介绍和使用方式
  • 剑指Offer 24-反转链表
  • 小研究 - Java虚拟机即时编译器的一种实现原理
  • 【LeetCode】416.分割等和子集
  • go vet中的那些检测项
  • Qt 自定义菜单、右键菜单
  • VScode 编辑器报错: ‘HelloWorld‘ is declared but its value is never read.
  • 如何使用LLM实现文本自动生成视频
  • Rust处理JSON
  • Python如何操作网络爬虫
  • linux文件复制覆盖命令
  • modbus概览
  • KMP算法开荒
  • XXL-JOB(2)
  • Linux常用命令_网络命令、关机重启命令
  • 用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part I
  • 如何使用Docker搭建ZooKeepe集群
  • 【javaweb】学习日记Day3 - Ajax 前后端分离开发 入门
  • SQL注入漏洞复现:探索不同类型的注入攻击方法
  • 大彩串口屏使用记录
  • Qt http 的认证方式以及简单实现