新闻中心

C++ weak_ptr解决循环引用_C++智能指针的循环依赖处理

2025-12-05
浏览次数:
返回列表
shared_ptr因循环引用导致内存泄漏,weak_ptr可打破循环。例如类A和B互相持有shared_ptr时,引用计数无法归零;将其中一个改为weak_ptr后,不增加引用计数,对象可正常析构,避免泄漏。实际中建议父对象用shared_ptr管理子对象,子对象用weak_ptr回指,观察者模式也适用此原则,访问weak_ptr应使用lock()获取临时shared_ptr,确保安全。

c++ weak_ptr解决循环引用_c++智能指针的循环依赖处理

在使用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 Lateral App

整理归类论文

Lateral App 85 查看详情 Lateral App 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多环境配置方案 

搜索