当前位置: 首页 > 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
在这里插入图片描述

相关文章:

weak_ptr是怎么探知对象生死的

weak_ptr是C智能指针中的一种。它用于解决共享所有权的问题&#xff0c;并且可以避免因循环引用而导致的内存泄漏。 weak_ptr本身并不承担对象的所有权&#xff0c;它指向由shared_ptr管理的对象。与shared_ptr不同&#xff0c;weak_ptr并不会增加计数器来计算对象的引用次数。…...

⌈算法进阶⌋图论::拓扑排序(Topological Sorting)——快速理解到熟练运用

目录 一、原理 1. 引例&#xff1a;207.课程表 2. 应用场景 3. 代码思路 二、代码模板 三、练习 1、210.课程表Ⅱ&#x1f7e2; 2、2392.给定条件下构造举证&#x1f7e1; 3、310.最小高度树 &#x1f7e1; 一、原理 1. 引例&#xff1a;207.课程表 就如大学课程安排一样&…...

【Python】【数据结构和算法】保留最后N个元素

使用deque&#xff0c;指定maxlen参数的值为N&#xff0c;例如&#xff1a; >>> from collections import deque >>> dq deque(maxlen3) >>> dq.append(1) >>> dq.append(2) >>> dq.append(3) >>> dq.append(4) >&…...

wireshark 基本使用

在Wireshark中&#xff0c;你可以使用过滤器来根据接口名称定位到特定的包。下面是一些常见的过滤器示例&#xff1a; 根据源或目的IP地址过滤&#xff1a; ip.src 192.168.0.1&#xff1a;过滤源IP地址为192.168.0.1的包。ip.dst 192.168.0.1&#xff1a;过滤目的IP地址为…...

2、结构型设计模式

结构型设计模式 目录 结构型设计模式1. 代理模式1.1 概述1.2 结构1.3 静态代理1)抽象主题类 SellTickets2)真实主题类 TrainStation3)代理类 ProxyPoint4)客户端类1.4 JDK 动态代理1)代理工厂类:ProxyFactory2)客户端类3)JDK 动态代理原理4)动态代理的执行流程是什么样…...

JavaScript下载excel文件

文章目录 通过链接下载a标签下载方法注意 获取文件流请求体配置下载文件流 总结 通过链接下载 a标签 对于已知地址的目标文件&#xff0c;前端可以使用 a标签 来直接下载&#xff0c;使用a标签下载使用到两个属性 download&#xff1a;下载文件名href&#xff1a;目标文件下…...

研磨设计模式day12命令模式

目录 定义 几个参数 场景描述 代码示例 参数化设置 命令模式的优点 本质 何时选用 定义 几个参数 Command&#xff1a;定义命令的接口。 ConcreteCommand:命令接口的实现对象。但不是真正实现&#xff0c;是通过接收者的功能来完成命令要执行的操作 Receiver&#x…...

设计模式 06 适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;属于结构型模式 概述 结构型模式关注如何将现有的类或对象组织在一起形成更加强大的结构。 在生活中&#xff0c;我们经常遇到这样的一个问题&#xff1a;轻薄笔记本通常只有 type-c 或者 usb-a 接口&#xff0c;没有网口。…...

UE4/5Niagara粒子特效之Niagara_Particles官方案例:3.3->4.3

目录 3.3 Visibility Tag 左边的发射器&#xff1a; 发射器更新 粒子生成 粒子更新 右边的发射器 和左边发射器不同的地方 3.4 Texture Sampling 发射器更新 粒子生成 粒子更新 4.1Play Audio Per Particle 系统 第三个发射器 发射器更新 粒子生成 粒子更新 第二个…...

数据结构队列的实现

本章介绍数据结构队列的内容&#xff0c;我们会从队列的定义以及使用和OJ题来了解队列&#xff0c;话不多说&#xff0c;我们来实现吧 队列 1。队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;…...

Gti的基本介绍和使用方式

Git 是一种分布式版本控制系统, 主要用于管理软件开发过程中的代码变更。其基本概念包括: 仓库 (Repository): Git中存储代码的基本单位&#xff0c;即一个代码库。在仓库中可以存储多个分支、标签、提交记录等。 分支 (Branch): Git中的分支是代码的不同开发方向&#xff0c;…...

剑指Offer 24-反转链表

题目描述&#xff1a;定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 解题思路&#xff1a; 这道题做过很多次&#xff0c;还是会…...

小研究 - Java虚拟机即时编译器的一种实现原理

深入分析了 &#xff2b;&#xff41;&#xff46;&#xff46;&#xff45;虚拟机的 &#xff2a;&#xff29;&#xff34;&#xff08;&#xff2a;&#xff55;&#xff53;&#xff54;&#xff0d;&#xff29;&#xff4e;&#xff0d;&#xff34;&#xff49;&#xf…...

【LeetCode】416.分割等和子集

题目 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和 [11] 。 示…...

go vet中的那些检测项

go vet 是 Go 语言自带的一个工具&#xff0c;用于分析 Go 代码中的常见错误和潜在问题。它可以检查代码中可能存在的各种问题&#xff0c;例如&#xff1a; 未使用的变量、函数或包 可疑的函数调用 错误的函数签名 程序中的竞态条件 错误的类型转换等 本文意图指令当前go vet所…...

Qt 自定义菜单、右键菜单

在接触Qt这段时间以来&#xff0c;经常遇到菜单项的问题&#xff08;右键菜单、托盘菜单、按钮菜单等&#xff09;&#xff0c;QMenu用于菜单栏,上下文菜单,弹出菜单等&#xff0c;利用QMenuQAction就可以达到效果&#xff01; 右键菜单实现&#xff1a;通过重写contextMenuEv…...

VScode 编辑器报错: ‘HelloWorld‘ is declared but its value is never read.

.vue文件被标识红色波浪线&#xff1b;提示&#xff1a; HelloWorld is declared but its value is never read. 问题原因&#xff1a; 因为vue3已经不支持vetur插件。 1、在扩展里面进行搜索Vetur插件&#xff0c;进行禁用或卸载&#xff1b; 2、在 VScode扩展里面搜索并下载…...

如何使用LLM实现文本自动生成视频

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 介绍 基于扩散的图像生成模型代表了计算机视觉领域的革命性突破。这些进步由Imagen&#xff0c;DallE和MidJourney等模型开创&#xff0c;展示了文本条件图像生成的卓越功能。有关这些模型内部工作的…...

Rust处理JSON

基本操作 Cargo.toml: [package]name "json"version "0.1.0"edition "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]serde { version "1", features …...

Python如何操作网络爬虫

Python是一种非常强大的编程语言&#xff0c;用于网络爬虫操作也非常方便。Python提供了许多用于构建和操作网络爬虫的库和工具&#xff0c;如BeautifulSoup、Scrapy、Requests等。本文将详细介绍Python如何操作网络爬虫。 一、安装相关库 首先&#xff0c;我们需要安装Python…...

QT开发避坑:为什么你的QWidget死活收不到mouseMoveEvent?从setMouseTracking到子控件拦截的完整排查指南

QT开发避坑指南&#xff1a;QWidget鼠标移动事件失效的深度排查 最近在重构一个QT项目时&#xff0c;我遇到了一个看似简单却令人抓狂的问题——明明已经调用了setMouseTracking(true)&#xff0c;但mouseMoveEvent就是死活不触发。经过两天的调试和源码追踪&#xff0c;终于梳…...

谷歌泄露Chromium未修复漏洞细节,数万用户或面临远程代码执行风险

Chromium漏洞泄露&#xff1a;从发现到“修复”的漫长历程 2022年12月&#xff0c;安全研究员Lyra Rebane报告了Chromium中一个未修复的漏洞&#xff0c;该漏洞会导致JavaScript在浏览器关闭后仍在后台运行&#xff0c;允许在设备上执行远程代码&#xff0c;此问题随后被确认为…...

OpenSCENARIO与OpenDRIVE如何协同工作?一份给仿真工程师的避坑指南

OpenSCENARIO与OpenDRIVE协同工程实践&#xff1a;从原理到避坑全指南 自动驾驶仿真测试中&#xff0c;动态场景与静态地图的精准配合如同交响乐团的指挥与乐谱——OpenSCENARIO负责编排车辆行为&#xff0c;OpenDRIVE则定义道路的物理结构。当两者协同出现毫米级偏差&#xff…...

MindSpore Transformers 训练任务快速上手

MindSpore Transformers&#xff08;简称 MindFormers&#xff09;是昇思 MindSpore 生态下的大模型训练套件&#xff0c;集成 BERT、GPT、LLaMA、Qwen 等主流 Transformer 模型&#xff0c;提供一键式预训练 / 微调、分布式并行、混合精度、监控可视化能力&#xff0c;适配昇腾…...

3分钟完成缠论分析:ChanlunX通达信插件实现自动画中枢

3分钟完成缠论分析&#xff1a;ChanlunX通达信插件实现自动画中枢 【免费下载链接】ChanlunX 缠中说禅炒股缠论可视化插件 项目地址: https://gitcode.com/gh_mirrors/ch/ChanlunX 还在为缠论分析的手动画线而烦恼吗&#xff1f;ChanlunX缠论插件为你带来终极解决方案&a…...

炉石传说佣兵战记自动化脚本:告别重复操作的全能指南

炉石传说佣兵战记自动化脚本&#xff1a;告别重复操作的全能指南 【免费下载链接】lushi_script This script is to save your time from Mercenaries mode of Hearthstone 项目地址: https://gitcode.com/gh_mirrors/lu/lushi_script 还在为《炉石传说》佣兵战记模式中…...

腾讯扔了个王炸:Marvis,每天送你1000万Token的AI管家

昨天,腾讯悄悄上线了一个东西。 没有发布会,没有雷军式的演讲,没有"遥遥领先"的排比句。 就是官网开了,下载链接放出来了。 但我试用了一天之后,想跟你说一句:这可能是我2026年见过最猛的AI产品。 它叫 Marvis(马维斯)。 01 先别急着"又一个AI助手&…...

Gemini 3.5十大应用场景:从代码生成到视频创作

一、软件开发场景 1.1 代码自动生成 Gemini 3.5 Flash在编码基准测试中达到76.2%&#xff0c;可以&#xff1a; 理解复杂技术文档生成高质量代码自动编写测试用例 # 代码生成示例 prompt """ 根据以下需求编写Python代码&#xff1a; 1. 创建一个REST API服…...

3分钟掌握加密压缩包密码破解:ArchivePasswordTestTool终极实战指南

3分钟掌握加密压缩包密码破解&#xff1a;ArchivePasswordTestTool终极实战指南 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾经…...

Agent 框架别急着乱学:先用 LangChain 搞懂 7 个基本模块

先说结论。 如果你想系统理解 Python Agent 框架&#xff0c;LangChain 仍然值得作为第一篇。它不是最轻的&#xff0c;也不是最“自动化”的&#xff0c;但它把 Agent 应用里的关键零件都摆出来了&#xff1a;模型、工具、状态、记忆、middleware、多 Agent 路由和 tracing。…...