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

控制块在SharedPtr中的作用(C++)

一句话先给结论:

控制块(Control Block)是 shared_ptr 的“户口本”——它记录引用计数、托管对象指针、自定义删除器、自定义分配器以及 weak_ptr 的额外信息;所有指向同一对象的 shared_ptr / weak_ptr 共用同一份控制块,从而保证“最后一个离开的人关灯”。


1️⃣ 控制块里到底放了什么?

字段 作用
T* ptr 真正托管的裸指针
size_t shared_count 当前存活 shared_ptr 个数
size_t weak_count 当前存活 weak_ptr 个数
Deleter deleter 用户自定义删除器(默认为 delete
Allocator allocator 用户自定义分配器
可选额外信息 type-erased 的 deleter / allocator、控制块自身内存布局等


2️⃣ 生命周期规则(口诀版)

  1. shared_count == 0 → 销毁托管对象(调用 deleter)
  2. shared_count + weak_count == 0 → 销毁控制块(释放内存)

因此:

  • 只要还有 任意 shared_ptr,托管对象 不会 被销毁。
  • 只要还有 任意 weak_ptr,控制块 不会 被销毁(weak_ptr 要查过期状态)。

3️⃣ 一张时序图

make_shared<T>() ─┐├─► [Control Block: ptr=T*, shared=1, weak=0]
shared_ptr<T> p ──┘shared_ptr<T> q = p;          // shared=2
weak_ptr<T>  w = p;           // weak=1
p.reset();                    // shared=1
q.reset();                    // shared=0 → 调用 deleter 销毁 T
w.expired();                  // 返回 false,weak=1 仍保活控制块
w.reset();                    // weak=0 → 销毁控制块

4️⃣ 与 make_shared / shared_ptr<T>(new T) 的细微差别

构造方式 控制块与对象内存布局
std::shared_ptr<T>(new T) 两次分配:先 new T,再 new ControlBlock → 可能 cache miss
std::make_shared<T>(...) 一次分配:一块连续内存里先放 T,再放 ControlBlock → 更快、省一次 new


5️⃣ 手写玩具代码回顾

template <typename T>
struct ControlBlock {T*       ptr;size_t   shared = 0;size_t   weak   = 0;/* optional deleter/allocator */
};

所有 SharedPtr<T> / WeakPtr<T> 拷贝时只改同一个 ControlBlock* 里的计数,对象与内存的“生死大权”全由控制块说了算。


✅ 一句话记住

控制块 = shared_ptr 的“中控室”;对象何时死、内存何时还,全看这间屋子里两个计数器。

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

相关文章:

  • 【秋招笔试】2025.08.15饿了么秋招机考-第二题
  • 基于MATLAB的机器学习、深度学习实践应用
  • Matlab(5)进阶绘图
  • 后端学习资料 持续更新中
  • StarRocks数据库集群的完整部署流程
  • plantsimulation中存储(store)、缓冲区(buffer)、放置缓冲区(PlaceBuffer)的区别,分别应用于那种情况
  • 第七十四章:AI的“诊断大师”:梯度可视化(torchviz / tensorboardX)——看透模型“学习”的秘密!
  • 测试用例的一些事项
  • API接口大全实用指南:构建高质量接口的六个关键点
  • Adobe Photoshop 2024:软件安装包分享和详细安装教程
  • Unity与OpenGL中的材质系统详解
  • 杭州电子商务研究院发布“数字化市场部”新部门组织的概念定义
  • Gato:多模态、多任务、多具身的通用智能体架构
  • Vue 组件二次封装透传slots、refs、attrs、listeners
  • 【Spring框架】SpringAOP
  • Ubuntu 22.04 安装PCL(Point Cloud Library)和Eigen库
  • 基于 Ubuntu22.04 安装 SSH 服务,记录
  • 如何实现免密码 SSH 登录
  • 零基础-动手学深度学习-10.4. Bahdanau 注意力
  • week1-[一维数组]传送
  • python-pycharm切换python各种版本的环境与安装python各种版本的环境(pypi轮子下载)
  • Linux下的软件编程——多任务(线程)
  • QT开发中如何加载第三方dll文件
  • C语言指针(五):回调函数与 qsort 的深层关联
  • 前端性能优化
  • JCTools 无锁并发计数器:ConcurrentAutoTable
  • obsidian ai/copilot 插件配置
  • epoll边缘模式收数据学习
  • 【100页PPT】数字化转型某著名企业集团信息化顶层规划方案(附下载方式)
  • 基于之前的Python附魔插件做出的一些改进