全网整合营销服务商

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

免费咨询热线: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  # 线程  # 对象  # 其中一个  # 仍为  # 前向  # 是一种  # 多个  # 它可以  # 它不  # 不可或缺  # 都为  # 但当 


相关文章: 兔展官网 在线制作,怎样制作微信请帖?  公司网站的制作公司,企业网站制作基本流程有哪些?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  建站主机选虚拟主机还是云服务器更好?  建站之星如何修改网站生成路径?  小型网站建站如何选择虚拟主机?  C++如何编写函数模板?(泛型编程入门)  建站主机是什么?如何选择适合的建站主机?  宝塔建站助手安装配置与建站模板使用全流程解析  如何快速搭建高效WAP手机网站吸引移动用户?  如何通过PHP快速构建高效问答网站功能?  ,网站推广常用方法?  建站之星如何防范黑客攻击与数据泄露?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  建站之家VIP精选网站模板与SEO优化教程整合指南  如何在阿里云ECS服务器部署织梦CMS网站?  如何通过NAT技术实现内网高效建站?  如何正确选择百度移动适配建站域名?  如何在Golang中指定模块版本_使用go.mod控制版本号  宝塔面板创建网站无法访问?如何快速排查修复?  营销式网站制作方案,销售哪个网站招聘效果最好?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  *服务器网站为何频现安全漏洞?  如何在云服务器上快速搭建个人网站?  C#怎么创建控制台应用 C# Console App项目创建方法  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  如何用虚拟主机快速搭建网站?详细步骤解析  如何通过wdcp面板快速创建网站?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  中山网站制作网页,中山新生登记系统登记流程?  无锡营销型网站制作公司,无锡网选车牌流程?  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何解决VPS建站LNMP环境配置常见问题?  如何制作一个表白网站视频,关于勇敢表白的小标题?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  建站VPS推荐:2025年高性能服务器配置指南  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  相册网站制作软件,图片上的网址怎么复制?  如何通过宝塔面板实现本地网站访问?  建站之星后台密码遗忘?如何快速找回?  C#如何在一个XML文件中查找并替换文本内容  网站制作员失业,怎样查看自己网站的注册者?  存储型VPS适合搭建中小型网站吗?  如何用AWS免费套餐快速搭建高效网站?  临沂网站制作公司有哪些,临沂第四中学官网?  如何配置WinSCP新建站点的密钥验证步骤?  香港服务器WordPress建站指南:SEO优化与高效部署策略  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站? 

您的项目需求

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