新闻中心
C++ weak_ptr解决循环引用_C++智能指针的循环依赖处理
shared_ptr因循环引用导致内存泄漏,weak_ptr可打破循环。例如类A和B互相持有shared_ptr时,引用计数无法归零;将其中一个改为weak_ptr后,不增加引用计数,对象可正常析构,避免泄漏。实际中建议父对象用shared_ptr管理子对象,子对象用weak_ptr回指,观察者模式也适用此原则,访问weak_ptr应使用lock()获取临时shared_ptr,确保安全。

在使用C++智能指针时,shared_ptr 能自动管理对象生命周期,避免内存泄漏。但当两个或多个对象通过 shared_ptr 相互引用时,容易出现循环引用问题,导致内存无法释放。这时就需要用到 weak_ptr 来打破循环。
循环引用的问题
考虑两个类 A 和 B,它们各自持有一个指向对方的 shared_ptr:
class B; // 前向声明class A {
public:
std::shared_ptr ptr;
~A() { std::cout };
class B {
public:
std::shared_ptr ptr;
~B() { std::cout };
如果这样使用:
auto a = std::make_shared();auto b = std::make_shared();
a->ptr = b;
b->ptr = a;
此时 a 和 b 的引用计数都为2。离开作用域后,a 和 b 各自的引用计数减1,但仍为1,析构函数不会被调用,造成内存泄漏。
weak_ptr 的作用
weak_ptr 是一种弱引用指针,它不增加对象的引用计数。它可以指向一个由 shared_ptr 管理的对象,但不会阻止该对象被销毁。
weak_ptr 常用于观察资源是否存在,需通过 lock() 方法获取一个临时的 shared_ptr 来安全访问对象:
- 若对象仍存在,lock() 返回有效的 shared_ptr
- 若对象已销毁,lock() 返回空 shared_ptr
用 weak_ptr 打破循环
修改上面的例子,将其中一个 shared_ptr 改为 weak_ptr:
Lateral App
整理归类论文
85
查看详情
class B; // 前向声明class A {
public:
std::shared_ptr ptr;
~A() { std::cout };
class B {
public:
std::weak_ptr ptr; // 改为 weak_ptr
~B() { std::cout };
现在 B 持有对 A 的弱引用。当 a 和 b 被创建并相互赋值后:
- A 持有 B 的 shared_ptr,B 的引用计数为1
- B 持有 A 的 weak_ptr,A 的引用计数仍为1(weak_ptr 不增引用)
当离开作用域时,a 和 b 的引用计数变为0,对象正常析构,不再泄漏。
实际使用建议
在设计有父子关系或监听机制的类时,注意引用方向:
- 父对象用 shared_ptr 持有子对象
- 子对象用 weak_ptr 回引父对象
- 观察者模式中,观察者用 weak_ptr 指向被观察者
访问 weak_ptr 时始终使用 lock(),确保线程安全和对象有效性。
基本上就这些。weak_ptr 不复杂,但能有效解决 shared_ptr 的循环依赖问题,是智能指针体系中不可或缺的一环。
以上就是C++ weak_ptr解决循环引用_C++智能指针的循环依赖处理的详细内容,更多请关注其它相关文章!
# 中文网
# 淮安seo优化制作
# seo培训学校机构
# 井陉互联网网站优化记录
# 论坛营销推广实训10
# 通化seo推广如何营销
# 拼多多的营销推广手段
# 建设跨境网站公司
# 关键词排名优化难做
# 鄂州seo在线咨询平台
# 企业网站建设毕业论文
# 之心
# c++
# 相关文章
# 多个
# 是一种
# 头文件
# 前向
# 仍为
# 其中一个
# 如何使用
# red
# 作用域
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
在J*a中如何使用Stream.map转换元素_Stream映射操作解析
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
QQ邮箱登录官网首页 腾讯QQ邮箱网页入口
Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置
R星幕后开发视频泄露 包含《GTA6》等多款大作
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相
抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧
Python字典中优雅地迭代剩余元素的方法
win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】
html5 app怎么运行环境_配html5 app运行环境【教程】
单射、满射与双射的关系 一文理清所有逻辑
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
CSS实现侧边栏导航项全宽圆角悬停背景效果
蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗
4399网页游戏电脑版全新入口 4399电脑端在线玩指南
抖音从哪里进入网页版_抖音官方入口链接
Golang如何使用context实现超时取消_Golang context超时取消模式实践
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
C++指针和引用有什么区别_C++内存管理核心概念深度解析
零跑汽车11月交付量达70327台 实现连续9个月正增长
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
uc浏览器网页版入口 uc浏览器网页版最新网址
百度网盘网页版入口 百度网盘网页版官方登录网址
提升Kafka消费者健壮性:会话超时处理与消息处理语义
J*aScript数组对象转换:按指定键分组与值收集
TikTok国际版官网直达_TikTok国际版官网直达进入在线观看
J*aScript设计模式实践_j*ascript代码优化
印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】
解决Python logging 中 datefmt 导致时间戳固定不变的问题
使用Python高效删除Word宏并转换DOCM为DOCX格式
怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】
天猫2025双十一0点秒杀攻略 天猫爆款抢购时间
c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学
12306几点到几点不能订票? | 官方最新系统维护时间全解析
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
新手怎么开始学化妆 零基础化妆入门教程
菜鸟取件码是什么怎么查 最全查询渠道汇总
FullCalendar 自定义按钮样式定制指南
Linux如何构建多环境配置管理_Linux多环境配置方案


2025-12-05
浏览次数:次
返回列表