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

C++的智能指针weak_ptr和普通指针的区别

我们之前说过weak_ptr可以用来解决share_ptr循环引用的问题,先来看看循环引用问题

    struct Node {
        std::shared_ptr<Node> next;
    };
    auto node1 = std::make_shared<Node>();
    auto node2 = std::make_shared<Node>();
    node1->next = node2;
    node2->next = node1;  // 循环引用

两个share指针指向的资源中的share指针指向对方,这样析构的时候,两个指针的强引用计数都从2减到1,不为0,资源没有释放

改为weak指针,只引用不计数,不增加share指针中的强引用计数,可以正常释放资源

    struct Node {
        std::weak_ptr<Node> next;
    };
    auto node1 = std::make_shared<Node>();
    auto node2 = std::make_shared<Node>();
    node1->next = node2;
    node2->next = node1;

下面看用普通指针能否解决

    struct Node {
        std::shared_ptr<Node>*next;
    };
    auto node1 = std::make_shared<Node>();
    auto node2 = std::make_shared<Node>();
    node1->next = &node2;
    node2->next = &node1;

用普通指针确实没有增加share指针的强引用计数,表面上看似解决了循环引用问题,实际上带来了普通指针的内存安全问题

此外weak_ptr可以通过lock()获取一个share_ptr,通过expired()获知资源是否还在,另外weak指针会进行弱引用计数

每个资源会对应一个控制块,在make_share指针的时候会给资源分配一个控制块,即所有指向同一对象的shared_ptrweak_ptr共享同一个控制块

+----------------------+
|     控制块结构        |
|----------------------|
| 强引用计数 (shared)   | ← 记录有多少个shared_ptr指向该对象
| 弱引用计数 (weak)     | ← 记录有多少个weak_ptr依赖此控制块
| 原始指针              | ← 实际管理的对象指针
| 删除器 (deleter)      | ← 自定义删除函数(如果有)
| 分配器 (allocator)    | ← 自定义分配器(如果有)
+----------------------+

强引用计数用于管理资源,计数为0时释放资源

弱引用计数用于管理控制块,当强引用计数和弱引用计数均为0时释放控制块

控制块在资源释放时仍然存在是为了方便weak_ptr查询资源状态

http://www.dtcms.com/a/109600.html

相关文章:

  • 第五课:高清修复和放大算法
  • MySQL安装教程(详细版)
  • Linux应用编程(文件IO)
  • 移远RG200U-CN模组WAKEUP_IN引脚
  • SAP ABAP AVL单元格颜色
  • 问题解决:glog中的LOG(INFO)与VLOG无法打印
  • 每日一题(小白)分析娱乐篇10
  • DDD与MVC扩展能力对比
  • Agent TARS与Manus的正面竞争
  • THUNLP_Multimodal_Excercise
  • Java - WebSocket配置及使用
  • Dart 语法
  • 【Tauri2】013——前端Window Event与创建Window
  • 搭建环境-opencv-qt
  • 震源车:震源激发平板模态分析
  • 使用python实现视频播放器(支持拖动播放位置跳转)
  • 第二十六章:Seaborn库实现统计数据可视化
  • 2025年机动车授权签字人考试判断题分享
  • 2025年渗透测试面试题总结- 某汽车厂商-安全工程师扩展(题目+回答)
  • 量子计算与经典计算的融合与未来
  • AI赋能——让人工智能助力工作提质增效
  • CVPR2024 | 构建时序动作检测模型对时序干扰的鲁棒性基准
  • 近日八股——计算机网络
  • 使用pycharm社区版调试DIFY后端python代码
  • 破解 N 皇后 II:位运算的高效艺术
  • 4月3日工作日志
  • CVSS-通用漏洞评分系统版本 4.0:规范文档
  • 代码随想录|动态规划|18完全背包理论基础
  • Java Lambda 表达式提升效率
  • 高效深度学习lecture01