全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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:

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++  # 作用域  # red  # 析构函数  # auto  # 循环  # 指针  # class  # public  # 线程  # 对象  # 其中一个  # 仍为  # 前向  # 是一种  # 多个  # 它可以  # 它不  # 不可或缺  # 都为  # 但当 


相关文章: 已有域名和空间,如何快速搭建网站?  ,交易猫的商品怎么发布到网站上去?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  建站之星安装步骤有哪些常见问题?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  如何用腾讯建站主机快速创建免费网站?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  简单实现Android文件上传  郑州企业网站制作公司,郑州招聘网站有哪些?  在线教育网站制作平台,山西立德教育官网?  常州自助建站费用包含哪些项目?  音乐网站服务器如何优化API响应速度?  长沙做网站要多少钱,长沙国安网络怎么样?  建站之星免费版是否永久可用?  历史网站制作软件,华为如何找回被删除的网站?  如何选择适合PHP云建站的开源框架?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  江苏网站制作公司有哪些,江苏书法考级官方网站?  相册网站制作软件,图片上的网址怎么复制?  太原网站制作公司有哪些,网约车营运证查询官网?  平台云上自助建站如何快速打造专业网站?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何选择最佳自助建站系统?快速指南解析优劣  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  青浦网站制作公司有哪些,苹果官网发货地是哪里?  已有域名能否直接搭建网站?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  小程序网站制作需要准备什么资料,如何制作小程序?  内部网站制作流程,如何建立公司内部网站?  Python多线程使用规范_线程安全解析【教程】  如何通过.red域名打造高辨识度品牌网站?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  如何在云服务器上快速搭建个人网站?  如何安全更换建站之星模板并保留数据?  安徽网站建设与外贸建站服务专业定制方案  网站企业制作流程,用什么语言做企业网站比较好?  如何通过虚拟机搭建网站?详细步骤解析  个人摄影网站制作流程,摄影爱好者都去什么网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  建站主机功能解析:服务器选择与快速搭建指南  代刷网站制作软件,别人代刷火车票靠谱吗?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何通过免费商城建站系统源码自定义网站主题与功能?  如何选择网络建站服务器?高效建站必看指南  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。