当前位置: 首页 > news >正文

c++编程实践—为什么需要weak_ptr

一、智能指针

在C/C++的开发中,指针的开发一直是一个老大难的问题,也是所有开发者感觉容易出问题的一个技术点。在早期推出过各种版本的autoptr,用着感觉不爽。所以一直也没有在开发广泛流行起来。从C++11起,新标准推出了智能指针shared_ptr和weak_ptr。前者好理解,指针可以共享,通过计数器来处理指针到底还有没有使用。但后者就会让开发者有些疑问,为什么出一个weak_ptr?它有什么作用呢?在哪里适用它呢?

二、weak_ptr

std::weak_ptr,弱引用智能指针。如果有过Boost库相关的智能指针开发的可能非常好理解。区别于std::shared_ptr,这个指针在拿到后,需要做一个判断,确定真正的对象仍然存在,才可能使用。类似下面的代码:

std::weak_ptr<Demo>wPtr;{std::shared_ptr<Demo>sPtr=std::make_shared<Demo>();wPtr=sPtr;}if(std::make_shared<Demo>sp=wPtr.lock()){//yes}else{//no}

这也意味着,weak_ptr其实无法直接访问对象,它不保证指针对象生命周期的存在即不影响生命周期,同样,它也不会影响shared_ptr的引用计数器。可以理解为,它只是一个智能指针的标记,标记后到底是否存在指针对象,它不做保证。
std::weak_ptr的主要作用在于解决智能指针的循环引用。也就是std::shared_ptr之间的互相引用,导致的资源泄露。除了这一种重要的情况外,它还可以实现对所有权的监视(不持有),这样既可以保证随时对指针对象的安全获取,但又不会增加智能指针的计数器,提高应用的安全性。

三、应用场景及分析

其实在弱引用智能指针的应用场景中,主要有以下几种情况:

  1. 破除std::shared_ptr循环引用
    这是std::weak_ptr最典型的一种用法。资源永远是计算机世界中最重要的东西,所以不可能平白的让资源白白消耗掉。实际场景中的代码如下:
//内存泄露的场景class Node{public:std::shared_ptr<Node>next;// std::shared_ptr<Node> prev; //导致循环引用std::weak_ptr<Node>prev;// weak_ptr打破循环引用};auton1=std::make_shared<Node>();auton2=std::make_shared<Node>();n1->next=n2;n2->prev=n1;

前后两个node节点互相持有,导致资源如果不强行干涉的话,永远不会释放,这就会造成内存泄露。

  1. 所有权(生命周期)的监控
    这也是weak_ptr一种比较常见的应用方式,比如在多线程、异步、库交互或事件通知等跨生命周期的活动中,既可能为了防止对象意外的释放,又有可能是减少对队列中生命周期控制的单一性,都可以使用weak_ptr(也可以理解为无法确定对象指针的生命周期的确定性时)。为了保证最终应用时,对象指针的安全就需要使用weak_ptr。看cppreference上的例子:
#include<iostream>#include<memory>std::weak_ptr<int>gw;voidobserve(){std::cout<<"gw.use_count() == "<<gw.use_count()<<"; ";// we have to make a copy of shared pointer before usage:if(std::shared_ptr<int>spt=gw.lock())std::cout<<"*spt == "<<*spt<<'\n';elsestd::cout<<"gw is expired\n";}intmain(){{autosp=std::make_shared<int>(42);gw=sp;observe();}observe();}
  1. 设计策略
    从设计上考虑,为了保证安全及统一管理。除本地使用shared_ptr外,其它提供给相关应用各方的都是weak_ptr。
  2. 接口提供了weak_ptr指针
    这个没有办法,别人的库、框架或接口提供了这个指针,则只能使用weak_ptr

上面的几种应用场景,其实主要还是防止std::shared_ptr指针的互相持有导致的可能各种资源的泄露。基于设计上的安全的考虑的目的以及所有权的监视只不过是可能互相持有的一种外沿罢了。

四、总结

std::weak_ptr是用来解决问题的,这是它出现的目的。而出现问题与正常使用相比,总是一种小概率事件。这也意味着,开发者不要把std::weak_ptr当成一种广泛使用情况。它只适合于在上面提到的一些具体情况下才适用。即合适的技术要用在合适的场景下,否则非但不能解决问题,反而可能引入更多的问题。

http://www.jsqmd.com/news/430892/

相关文章:

  • 2026年 北京管道疏通服务推荐榜单:专业疏通马桶/下水道,朝阳区高效解决堵塞难题的靠谱选择 - 品牌企业推荐师(官方)
  • 好用还专业! 降AI率平台 千笔·降AIGC助手 VS Checkjie,本科生首选
  • 2026年3月移动激光焊机厂家推荐,可移动灵活焊接设备 - 品牌鉴赏师
  • 2026年电商平台网站开发新趋势,融意网络助力B2B/B2C模式升级,网站开发/网络公司/软件开发,网站开发企业选哪家 - 品牌推荐师
  • 3个创新维度让玩家实现游戏语言无缝转换
  • 剖析2026年靠谱的ROHS2.0检测仪实力供应商,选哪家更合适 - 工业品牌热点
  • macOS如何完美适配游戏手柄?从驱动到优化的全流程方案
  • 2026年度,超级恒温槽性能优的产品出自哪家公司? - 品牌推荐大师
  • 探讨口碑好的ISO认证品牌企业排名,中安质环认证江苏中心排第几? - 工业推荐榜
  • Escrcpy键盘映射完全指南:打造个性化Android设备控制体验
  • 2026年耐高温标签|UL户外耐久标签|线缆标签|阻燃标签厂家选型指南,附标杆企业推荐 - 速递信息
  • 性价比之王!2026实验磨粉机低价高质品牌推荐:万元级设备怎么选? - 品牌推荐大师1
  • 2026必备!AI论文平台 千笔 VS 笔捷Ai,专为本科生打造!
  • 2026塑钢模板哪家强?五大实力品牌推荐,桦诚达钢模板领跑新势力 - 深度智识库
  • 应届生求职机构哪家更好?96%offer交付+名企内推(26年榜单) - Matthewmx
  • 科研党收藏!AI论文网站 千笔AI VS speedai,MBA写论文更高效!
  • ssm+java2026年毕设前途招聘求职网站【源码+论文】
  • 如何用1款开源工具解锁加密音频自由?音频格式转换完整指南
  • 如何解决米游社多账号签到难题?这款工具让游戏福利获取效率提升10倍
  • 智能内容获取系统:解决多场景阅读障碍的全流程解决方案
  • 易语言开发从入门到精通:进阶篇·Windows应用程序高级界面设计与交互优化深度实战·圆角按钮/渐变背景/自定义控件·动画效果/响应式布局·键盘导航/右键菜单/拖拽操作·无障碍设计/用户体验优化
  • Prompt | 生成 leetcode 题解
  • 如何拯救你的QQ空间回忆?揭秘GetQzonehistory的数字时光机价值
  • 重庆日式原木风装修设计哪家口碑好,十二分装饰了解下 - 工业推荐榜
  • Cursor Free VIP:验证码自动化获取的终极解决方案
  • jd-happy:让稀缺商品抢购效率提升80%的自动化工具
  • 北京生鲜专用纸箱定制加工生产哪家性价比高,有推荐的吗? - myqiye
  • 工厂造个“平行世界”:数字孪生(DT)工程如何重塑工业未来?
  • 2026年圆形验粉筛性价比品牌盘点:低价≠低质,这些厂家凭实力出圈 - 品牌推荐大师1
  • 鸿蒙应用开发:UI定制与动画效果