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

共享指针——弱引用

下面是对你这部分内容的表达优化版,在不改变原有技术结论的前提下,重点提升了:

  • 术语准确性(weak_ptr 而非 weak_pointer
  • 概念先行、再给代码、再讲应用
  • 对“循环引用”的因果关系描述更加清晰

智能指针

弱引用指针 —— weak_ptr

weak_ptr 是一种不拥有资源所有权的智能指针,它只对对象进行弱引用,不会影响对象的生命周期。

其主要特点如下:

  • 不参与引用计数,不会增加 shared_ptruse_count
  • 不拥有对象所有权,因此不能直接使用 -> 或解引用 *
  • 不能单独创建,必须依附于 shared_ptr 存在
  • 可通过 lock() 方法安全地转换为 shared_ptr

创建与类型转换

weak_ptr 通常由已有的 shared_ptr 创建,并用于观察对象的生命周期。

弱引用的创建与提升
int main()
{shared_ptr<cat> cat1 = make_shared<cat>("Tom");// 由 shared_ptr 创建 weak_ptr(不会增加引用计数)weak_ptr<cat> weak_cat1 = cat1;cout << weak_cat1.use_count() << endl; // 1cout << cat1.use_count() << endl;      // 1// 通过 lock() 将 weak_ptr 提升为 shared_ptrshared_ptr<cat> cat2 = weak_cat1.lock();cout << cat2.use_count() << endl;      // 2
}

说明:

  • lock() 会检查对象是否仍然存活
  • 若对象已被释放,lock() 返回一个空的 shared_ptr,避免悬空指针问题

典型应用场景

  1. 某个类(如 A 类)需要保存其他同类型对象的引用信息
  2. 如果直接使用 shared_ptr,多个对象之间容易形成循环引用(Cyclic Dependency)
  3. 为避免循环依赖,应使用不拥有所有权的引用关系
  4. weak_ptr 正是用于这种“仅引用、不管理生命周期”的场景
  5. 在需要访问对象时,可通过 lock() 临时获取 shared_ptr

weak_ptr 解决循环引用问题

当两个对象相互持有对方的 shared_ptr 时,会导致如下问题:

  • A 持有 B 的 shared_ptr
  • B 同时也持有 A 的 shared_ptr
  • 即使外部不再使用 A 或 B,它们的引用计数仍然不为 0
  • 导致对象无法析构,产生内存泄漏

这就是典型的循环引用问题

在下面的示例中,我们将 c3c4 互相设为“朋友”,并在两个类中都使用 shared_ptr 保存对方:

结果:对象可以被创建,但无法被销毁

image


使用 weak_ptr 的改进方案

将其中一方(或双方)对对方的引用:

  • shared_ptr 改为 weak_ptr

此时:

  • 引用关系仍然存在
  • 但不会影响对象的生命周期
  • 当外部 shared_ptr 释放后,对象即可正常析构

程序将恢复正常运行

image


一句话总结

  • shared_ptr 管理生命周期
  • weak_ptr 只负责观察,不拥有资源
  • 打破循环引用,必须引入 weak_ptr
http://www.gsyq.cn/news/148874.html

相关文章:

  • Hugging Face smolagents曝高危漏洞:反序列化缺陷可致远程代码执行
  • 自考必备!8个AI论文软件推荐,轻松搞定毕业论文格式规范!
  • Bootstrap5 按钮组
  • spec kit ai code review
  • mysql的跨库查询
  • 基于Python豆瓣电影数据可视化分析设计与实现(毕设源码+文档)
  • GA-ELM土壤分类
  • Perl 基础语法
  • Day39bootstrap--组件
  • SQL INSERT INTO 语句详解
  • Hive调优
  • 拒绝转圈圈!AI Ping 注入 Coze,带你瞬发体验限免版 GLM-4.7 与 MiniMax-M2.1
  • Omdia发布《2025全球企业级MaaS市场分析》,火山引擎居全球第三
  • Bootstrap4 创建一个网页
  • 干货盘点|新电脑装机必备的 10 个 Windows 软件,不然用起来太难受!
  • WinCC Unified V19 ES/RT 安装
  • Perl POD 文档
  • DC-1 复现
  • 2026 年沃尔玛购物卡回收全攻略 - 京顺回收
  • 实用指南:群晖 NAS 变私人影院?Nastool+cpolar 让影音资源随心看
  • jEasyUI 窗口与布局
  • Java毕设选题推荐:基于Java的师生实验报告管理系统的设计与实现基于SpringBoot和Vue的实验报告管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 【课程设计/毕业设计】基于SpringBoot和Vue的实验报告管理系统的设计与实现基于springboot的实验报告管理系统的设计与实现【附源码、数据库、万字文档】
  • 【ROS2】ROS2+Qt6+WebRTC程序依赖库
  • 开源工具包repomix提取代码框架信息
  • AI Ping最新上线了,现在来免费用!MiniMax-M2.1、GLM-4.7,手把手教学部署与运用
  • 反向海淘火了!它到底解决了海淘的哪些痛点?
  • 基于PLC的交通灯控制系统设计红绿灯控制博图组态仿真
  • pq|dfs|快排
  • NX ①添加GC工具箱 ②制图绘制中心线 ③制图倒斜角标注C ④更新重量