新闻中心

C++如何使用std::shared_ptr处理共享对象?(引用计数)

2025-12-15
浏览次数:
返回列表
std::shared_ptr通过引用计数实现共享对象的自动内存管理,推荐用make_shared构造、weak_ptr打破循环引用、自定义删除器管理非默认资源。

c++如何使用std::shared_ptr处理共享对象?(引用计数)

std::shared_ptr 管理共享对象,核心是让多个指针安全地指向同一块堆内存,并在最后一个指针销毁时自动释放资源——靠的就是内部的引用计数。

创建 shared_ptr 并观察引用计数

不能直接用裸指针构造 shared_ptr(除非明确需要),推荐用 std::make_shared,它更高效且异常安全:

  • auto p1 = std::make_shared<int>(42);</int> —— 引用计数初始为 1
  • auto p2 = p1; —— 复制后,引用计数变为 2;p1p2 指向同一对象
  • std::cout 输出 <strong>2</strong>;<code>p2.use_count() 同样是 2

共享但不增加引用计数?用 weak_ptr 观察

如果只想“观察”共享对象,又不想影响生命周期,用 std::weak_ptr

  • std::weak_ptr<int> wp = p1;</int> —— wp.use_count() 仍是 2,wp.expired() 返回 false
  • p1.reset(); p2.reset(); 后,对象被释放,wp.expired() 变为 true
  • 要用时调用 wp.lock() 获取临时 shared_ptr,若已过期则返回空指针

小心循环引用:shared_ptr 之间互相持有

两个对象用 shared_ptr 互相保存对方,会导致引用计数永远 >0,内存泄漏:

  • 例如 A 里有 std::shared_ptr<b> b_ptr;</b>,B 里有 std::shared_ptr<a> a_ptr;</a>
  • 解决方法:一方改用 std::weak_ptr(比如 B 中用 weak_ptr<a></a>
  • 访问前检查:if (auto locked_a = a_ptr.lock()) { /* 安全使用 *locked_a */ }

自定义删除器与非默认资源管理

当管理的不是普通 new 出来的对象(比如 C 风格资源、数组、或需特殊清理逻辑),可以传入删除器:

  • auto ptr = std::shared_ptr<int>(new int(10), [](int* p) { delete p; });</int>
  • 管理数组:std::shared_ptr<int> arr(new int[10], std::default_delete<int>{});</int></int>
  • 管理 FILE*:std::shared_ptr<file>(fopen("a.txt", "r"), [](FILE* f) { if(f) fclose(f); });</file>

基本上就这些。引用计数是透明的,你只需专注“谁在用”,shared_ptr 自己会算账。关键点就三个:用 make_shared 构造、用 weak_ptr 打破循环、按需定制删除器。

以上就是C++如何使用std::shared_ptr处理共享对象?(引用计数)的详细内容,更多请关注其它相关文章!


# 仍是  # ecshop seo视频教程  # 深圳快速seo企业  # 微信怎么做内容营销推广  # 搜狗关键词排名多少 s  # 泉州seo做到首页服务  # 网站优化后期工作流程图  # 南山网络seo优化公司  # 大庆抖音seo团队推荐  # 智能网站建设商家  # 卖袜子怎么做营销推广  # c++  # 中文网  # 相关文章  # 并在  # 只需  # 多个  # 动态分配  # 自定义  # 如何使用  # red  # 解决方法 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 解决Flask中Quill编辑器内容提交失败及TypeError的指南  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  c++ 获取系统当前时间 c++时间戳获取方法  优化Django表单:提交验证失败后保留用户输入  如何在CSS中使用浮动制作导航栏_float实现水平菜单  黑猫投诉统一入口官网 消费者权益保护投诉平台  AO3同人作品网入口 AO3搜索引擎官网永久地址  如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率  VS Code远程开发时如何处理文件权限问题  必由学官网快捷入口 必由学网页版在线学习平台  谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  AO3最新入口2025公告_AO3中文官网合集  Go语言JSON解析深度指南:动态访问与结构体映射实践  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  深入理解J*a链表中的IPosition接口与使用  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  PySpark中从现有列右侧提取可变长度字符创建新列的教程  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  微信网页版官方入口直达 微信网页版网页版登录使用方法  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  零跑汽车11月交付量达70327台 实现连续9个月正增长  Win10双系统截图高效法 截屏快捷键速记【技巧】  mcjs网页版在线存档 mcjs云存档登录入口  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  知音漫客正版漫画平台_知音漫客官网账号登录  Pyrogram与g4f集成:异步编程实践与常见错误解决  qq游戏网页版直接玩_qq游戏免下载快速入口  Lar*el DB::listen 事件中的查询执行时间单位解析  Tabulator表格中精确实现日期时间排序的指南  cad如何更改注释性对象的比例_cad注释性比例调整方法  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  AO3官方在线访问地址 Archive of Our Own最新镜像合集  提升Kafka消费者健壮性:会话超时处理与消息处理语义  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法  小红书网页版入口链接分享 小红书官网直接进  Pandas DataFrame 多条件优先级排序与排名  J*a 递归快速排序中静态变量的状态管理与陷阱  steam官方网页快速访问 steam账号注册全流程  必由学官方登录入口 必由学教师学生账号快速访问  汽水音乐在线版入口_汽水音乐网页播放手册  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  Python:递归比较文件夹内容并找出特定类型文件的差异  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  《噬血代码2》新预告片发布 展示游戏剧情  内存疯狂猛猛涨价:主板销量直接腰斩!  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合 

搜索