当前位置: 首页 > 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.jsqmd.com/news/135519/

相关文章:

  • wsl docker安装达梦数据库的过程
  • Java毕设选题推荐:基于springboot的高校党员信息管理系统基于springboot高校党建管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Ruby RubyGems:全面解析
  • Hugging Face smolagents曝高危漏洞:反序列化缺陷可致远程代码执行
  • 两种核心消息队列:环形队列与RTOS消息队列解析
  • 自考必备!8个AI论文软件推荐,轻松搞定毕业论文格式规范!
  • Bootstrap5 按钮组
  • spec kit ai code review
  • mysql的跨库查询
  • 基于Python豆瓣电影数据可视化分析设计与实现(毕设源码+文档)
  • 【Azure Notification Hub】实验Notification Hub页面中的Test Tag 功能 -- 定向发送消息到指定的Android设备
  • Perl 基础语法
  • AI元人文构想的诗意阐释
  • Day39bootstrap--组件
  • 详细介绍:初识MySQL 库的操作
  • Hive调优
  • 生产级微服务应用全攻略:从骨架到运维的完整体系
  • bat文件中,提权,以管理员运行
  • Redis分布式锁全攻略:原理、陷阱与Redisson最佳实践
  • 拒绝转圈圈!AI Ping 注入 Coze,带你瞬发体验限免版 GLM-4.7 与 MiniMax-M2.1
  • SQL INSERT INTO 语句详解
  • Bootstrap4 创建一个网页
  • 工程师必备!AI Ping 平台 GLM-4.7 与 MiniMax M2.1 国产大模型实用指南
  • 京东e卡回收平台哪个才靠谱? - 京顺回收
  • 一文吃透 Nginx Server:多域名、网关、负载均衡
  • 干货盘点|新电脑装机必备的 10 个 Windows 软件,不然用起来太难受!
  • Minio的Docker部署
  • Perl POD 文档
  • WinCC Unified V19 ES/RT 安装
  • WinCC Unified V19 ES/RT 安装