std::weak_ptr是一种不增加引用计数的智能指针,用于解决std::shared_ptr的循环引用问题。它通过lock()方法临时获取shared_ptr来访问对象,若对象已释放则返回空,常用于父子节点、缓存、回调等场景,避免内存泄漏。

在C++中,std::weak_ptr 是一种智能指针,用于解决 std::shared_ptr 可能导致的循环引用问题。它本身不控制所指向对象的生命周期,只是“观察”由 shared_ptr 管理的对象,因此被称为“弱引用”。
weak_ptr 不增加对象的引用计数,它指向一个可能已被释放的对象。要使用 weak_ptr 指向的对象,必须先通过 lock() 方法转换为 shared_ptr。如果对象还存在,lock() 返回一个有效的 shared_ptr;否则返回空指针。
基本用法示例:
#include <memory>
#include <iostream>
std::shared_ptr<int> sp = std::make_shared<int>(42);
std::weak_ptr<int> wp = sp; // 不增加引用计数
if (auto locked = wp.lock()) {
std::cout << *locked << std::endl; // 输出: 42
} else {
std::cout << "对象已释放" << std::endl;
}
当两个对象互相持有对方的 shared_ptr 时,引用计数永远无法归零,导致内存泄漏。这就是典型的循环引用问题。
例如,父子节点结构中:
struct Node {
std::shared_ptr<Node> parent;
std::shared_ptr<Node> child;
};
如果父节点持有子节点的 shared_ptr,子节点也持有父节点的 shared_ptr,那么即使外部引用被释放,这两个对象仍相互引用,无法析构。
标贝悦读AI配音
在线文字转语音软件-专业的配音网站
66
查看详情
解决方案是:一方使用 weak_ptr。通常子节点用 weak_ptr 指向父节点:
struct Node {
std::weak_ptr<Node> parent; // 避免循环
std::shared_ptr<Node> child;
};
这样,当父节点被释放后,子节点中的 weak_ptr 不会阻止其销毁。访问父节点时需临时提升为 shared_ptr:
if (auto p = parent.lock()) {
// 安全使用父节点
} else {
// 父节点已释放
}
weak_ptr 的核心价值在于:既能安全访问可能存在的对象,又不干预其生命周期管理。
std::weak_ptr 主要用于打破 shared_ptr 的循环引用,同时适用于需要“临时访问”但不延长生命周期的场景。正确使用 weak_ptr 能有效避免内存泄漏,提升程序资源管理的健壮性。
基本上就这些,关键是在设计对象关系时判断是否“拥有”所有权——只有一方真正负责生命周期时,另一方就该用 weak_ptr。不复杂但容易忽略。
以上就是c++++中的std::weak_ptr有什么用_c++ weak_ptr弱引用的用途与避免循环引用的详细内容,更多请关注其它相关文章!
# 是在
# 怎样自己建设网站推广
# 北海热门seo优化
# seo快排政策
# 璧山建设网站制作
# 淘宝seo深度
# 亮剑seo 6.2
# 网上营销推广预算
# seo网络排名优化技巧
# 荣沐网络seo
# 洛阳家装网站建设
# 已被
# 与其他
# node
# 内存管理
# 如何使用
# 自定义
# 数据结构
# 什么用
# 是一种
# 回调
# red
# stream
# 资源管理器
# ios
# c++
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置
windows10怎么设置电源按钮_windows10按下电源键功能修改
Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法
如何在CSS中使用过渡制作按钮边框渐变_border-color transition实现
PHP与SQL实践:高效实现数据复制与特定列值修改
Win10怎么设置快速启动 Win10开启快速启动设置方法
Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解
京东快递包裹信息查询入口 京东快递官方查询平台入口
sublime怎么在文件中显示代码结构大纲_sublime符号列表功能
excel怎么计算平均值 excel平均函数*ERAGE使用教学
sublime怎么快速在浏览器中预览HTML_sublime配置View in Browser教程
抖音官网入口快速访问 抖音网页版账号注册解析
谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接
Win11便笺在哪打开 Win11桌面便笺(Sticky Notes)使用方法【详解】
电脑开不了机怎么办 电脑无法开机的解决方法
百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置
CSS过渡与滚动滚动事件结合应用_scroll与transition动画
银信通自动开通原因揭秘
Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南
漫蛙漫画官方版直通入口 2025漫蛙漫画免注册访问说明
J*a中的值传递到底指什么_值传递模型在参数传递中的真正含义说明
漫蛙manwa官网浏览入口_漫蛙漫画网页版访问链接
铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明
如何配置VS Code作为您Git操作的默认编辑器
QQ邮箱PC端登录页面_QQ邮箱网页版登录界面
Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法
使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel
顺丰快递单号查询寄件人 顺丰寄件人查询入口
word文档行距怎么调?word文档调行距的操作步骤
知乎APP怎么查看自己被邀请的问题_知乎APP邀请回答记录查看与参与方法
手机远程连接电脑方法
4399正版网页版入口高清直达链接
抄漫画官网防走失地址_抄漫画最新漫画完整版阅读入口
《书耽》更换手机号方法
优化长HTML属性值:SonarQube警告与实用策略
123平台官方登录入口 123邮箱网页端在线沟通工具
《via浏览器》强制缩放网页设置方法
iPhone14开启Apple TV遥控设置
在Peewee中处理PostgreSQL记录重复:一站式数据摄取教程
如何解决Casbin日志与应用日志不统一的问题,使用casbin/psr3-bridge实现无缝集成
深入理解随机递归函数的确定性:内部节点、叶节点与时间复杂度分析
《360浏览器》自动保存账号密码设置方法
国际经济与贸易就业方向解析
《下一站江湖2》大雪山加入方法
晨报|开发商暗示《空洞骑士:丝之歌》DLC开发中 《合金装备4》有望重制
使用Selenium在无头Chrome中交互动态菜单和复选框的策略
Go语言反射机制:如何访问被嵌入结构体遮蔽的方法
WooCommerce 新客户订单自动添加管理员备注教程
服装短视频如何起号推广?服装短视频起号推广有什么要求?
AO3官方镜像链接 | 最新防走失网址永久收藏
2025-11-14
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。