C++ weak_ptr解决了什么问题_C++解决shared_ptr循环引用方案


答案:weak_ptr通过弱引用打破shared_ptr的循环引用,避免内存泄漏。在相互引用场景中,将一端改为weak_ptr,使引用计数不增,对象可正常释放;访问时需用lock()获取临时shared_ptr。

c++ weak_ptr解决了什么问题_c++解决shared_ptr循环引用方案

在C++中,shared_ptr 是一种智能指针,通过引用计数自动管理对象生命周期。当多个 shared_ptr 指向同一个对象时,引用计数增加;只有当所有指向该对象的 shared_ptr 都被销毁或重置后,对象才会被释放。但这种机制存在一个问题:循环引用。

循环引用导致内存泄漏

当两个或多个对象通过 shared_ptr 相互持有对方时,引用计数永远无法降为0,即使这些对象已经不再被外部使用,也无法被释放。

例如:

class B;
class A {
public:
std::shared_ptr ptr_b;
~A() { std::cout };

class B {
public:
std::shared_ptr ptr_a;
~B() { std::cout };

int main() {
auto a = std::make_shared();
auto b = std::make_shared();
a->ptr_b = b;
b->ptr_a = a;
return 0;
}

这段代码中,A 持有 B 的 shared_ptr,B 也持有 A 的 shared_ptr。main 函数结束时,a 和 b 离开作用域,引用计数减1,但由于彼此仍相互引用,引用计数不会归零,A 和 B 都不会被析构,造成内存泄漏。

weak_ptr 解决循环引用问题

weak_ptr 是一种弱引用指针,它不增加对象的引用计数。它可以指向一个由 shared_ptr 管理的对象,但不会影响其生命周期。weak_ptr 常用于打破 shared_ptr 的循环引用。

修改上面的例子:

星火作家大神 星火作家大神

星火作家大神是一款面向作家的AI写作工具

星火作家大神 140 查看详情 星火作家大神 class B;
class A {
public:
std::shared_ptr ptr_b;
~A() { std::cout };

class B {
public:
std::weak_ptr ptr_a;
~B() { std::cout };

int main() {
auto a = std::make_shared();
auto b = std::make_shared();
a->ptr_b = b;
b->ptr_a = a;
return 0;
}

此时,B 中对 A 的引用改用 weak_ptr,不增加引用计数。当 main 函数结束时,a 和 b 的引用计数都变为1(仅自身持有),随后 a 析构,A 对象释放,接着 b 析构,B 对象也释放。整个过程正常完成,无内存泄漏。

访问 weak_ptr 所指向的对象时,需通过 lock() 方法获取一个临时的 shared_ptr:

if (auto temp = b.ptr_a.lock()) {
// 使用 temp 访问 A 对象
} else {
// A 已被释放
}

lock() 成功返回有效的 shared_ptr,失败则返回空 shared_ptr,表示原对象已被销毁。

何时使用 weak_ptr

  • 打破 shared_ptr 的循环引用结构,如父子节点、观察者模式中的回调持有等。
  • 实现缓存或资源池,避免长期持有对象导致无法释放。
  • 作为事件或回调中的“弱监听”,防止因反向引用造成内存泄漏。

基本上就这些。weak_ptr 不控制生命周期,只观察,是解决 shared_ptr 循环引用的标准方案。合理使用,能有效避免内存泄漏,同时保持智能指针的安全性。

以上就是C++ weak_ptr解决了什么问题_C++解决shared_ptr循环引用方案的详细内容,更多请关注其它相关文章!


# 结束时  # 关键词seo案例  # 天津字画推广营销中心  # 湖南营销推广哪种好干  # 微信小程序页面seo  # 宁波网站建设与推广方案  # 云浮网站建设排名推广  # seo的测试题  # 禹州网站建设维护  # 益阳网站建设教程  # 阳泉企业网站推广服务  # 才会  # 回调  # 循环引用  # 如何使用  # 解决了  # 已被  # 多个  # 是一种  # 什么问题  # 大神  # red  # 作用域  # c++  # ai 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 高德地图怎么查看未来行程规划_高德地图未来行程规划查看方法  嘀嗒顺风车如何开具电子发票  《下一站江湖2》武器获取方法  Dagster资产间数据传递与用户配置管理教程  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  抖音如何进行蓝V认证 抖音企业号申请所需资料与流程  微信客户端怎么查看二维码_微信客户端个人二维码查看方法  小米civi如何设置锁屏时间  word怎么将图片设置为页面背景并不影响打印_Word图片背景设置方法  Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置  PPT智能排版生成入口 免费PPT内容自动生成平台  抖音视频如何添加标题?添加标题有哪些好处?  macosmonterey系统外接显示器驱动怎么安装_macosmonterey外接显示器驱动与分辨率调整  画质怪兽120帧安卓和平精英免费版  《海底捞》点外卖方法  《梦想世界:长风问剑录》药师一图流分享  Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制  CSS如何在页面中引入重置样式_使用Normalize.css或Reset.css统一浏览器默认样式  如何在CSS中使用absolute实现登录弹窗居中_transform translate结合  德邦快递会员怎么开通  在Django单元测试中优雅处理信号:基于环境的条件执行策略  优化Leaflet弹出层图片显示:条件渲染策略  《U校园》学生登录入口2025  邦丰播放器频道搜索设置  TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法  263企业邮箱如何设置邮件转发功能  电脑没有声音了怎么办 电脑声音问题的全面排查与修复指南【详解】  SQLAlchemy 2.0 与 Pydantic 模型类型安全集成指南  Lar*el怎么实现全文搜索_Lar*el Scout集成Algolia教程  TikTok网页版实时观看入口 TikTok网页版短视频在线浏览  uc浏览器官网网页版使用 uc浏览器官网免费在线首页  如何在CSS中实现盒模型多列间距_grid-gap与padding结合  荣耀magicv5怎么上手测评  mysql怎么查询数据_mysql基础查询语句使用教程  《伊瑟》凶影追缉库卢鲁boss攻略  b站怎么用微信登录_b站微信登录方法  抖音商城官网是什么_抖音商城官方网址与访问方法  跨语言测试实践:使用Python Selenium测试现有J*a Web项目  如何在vscode中关闭it环境  铁路12306怎么申请退票_铁路12306退票申请操作流程  Dash应用中自定义HTML页面标题与网站图标(F*icon)的实用指南  江苏大剧院会员卡购买步骤  《百果园》充值余额方法  b站如何剪辑视频_b站必剪app使用教程  《土豆雅思》修改密码方法  word文档行距怎么调?word文档调行距的操作步骤  百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置  三星M34录音变声问题_Samsung M34麦克风调整  PDF如何批量加注释_PDF多文件批注高亮操作教程  视频转蓝光m2ts格式 

 2025-12-13

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.