全网整合营销服务商

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

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

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

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

修改上面的例子:

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 循环引用的标准方案。合理使用,能有效避免内存泄漏,同时保持智能指针的安全性。


# ai  # c++  # 作用域  # red  # if  # auto  # int  # 循环  # 指针  # class  # public  # 对象  # 事件  # 是一种  # 多个  # 已被  # 结束时  # 回调  # 才会  # 这段  # 它可以  # 一个问题  # 它不 


相关文章: 红河网站制作公司,红河事业单位身份证如何上传?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  利用JavaScript实现拖拽改变元素大小  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  如何在香港免费服务器上快速搭建网站?  如何快速搭建高效服务器建站系统?  如何挑选最适合建站的高性能VPS主机?  ,网页ppt怎么弄成自己的ppt?  ui设计制作网站有哪些,手机UI设计网址吗?  如何在云主机上快速搭建网站?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  网站图片在线制作软件,怎么在图片上做链接?  如何通过cPanel快速搭建网站?  如何选择可靠的免备案建站服务器?  ,巨量百应是干嘛的?  如何通过远程VPS快速搭建个人网站?  香港网站服务器数量如何影响SEO优化效果?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  如何快速查询网址的建站时间与历史轨迹?  招贴海报怎么做,什么是海报招贴?  如何确保西部建站助手FTP传输的安全性?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  清除minerd进程的简单方法  浅谈Javascript中的Label语句  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  香港服务器选型指南:免备案配置与高效建站方案解析  网站制作员失业,怎样查看自己网站的注册者?  如何通过wdcp面板快速创建网站?  微信小程序 input输入框控件详解及实例(多种示例)  如何通过主机屋免费建站教程十分钟搭建网站?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  Android使用GridView实现日历的简单功能  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何通过智能用户系统一键生成高效建站方案?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  行程制作网站有哪些,第三方机票电子行程单怎么开?  网站微信制作软件,如何制作微信链接?  建站主机功能解析:服务器选择与快速搭建指南  股票网站制作软件,网上股票怎么开户?  模具网站制作流程,如何找模具客户?  营销式网站制作方案,销售哪个网站招聘效果最好?  建站主机默认首页配置指南:核心功能与访问路径优化  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  金*站制作公司有哪些,金华教育集团官网?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  广平建站公司哪家专业可靠?如何选择?  nginx修改上传文件大小限制的方法 

您的项目需求

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