C++11智能指针shared_ptr的控制块内都有什么?

shared_ptr只是一个轻量对象,真正管理资源的是控制块

结构我大概写一下:

复制代码
shared_ptr
   │
   └── control block
        ├── object pointer
        ├── strong count
        ├── weak count
        ├── deleter
        └── allocator

一、object pointer(对象指针)

控制块内会保存T* ptr ,也就是被管理对象的地址

例如:

cpp 复制代码
std::shared_ptr<int> p(new int(10));

控制块内里会记录:ptr -> int(10)

二、strong count(强引用计数)

这个非常好理解,就是当前有多少个shared_ptr指向该对象

cpp 复制代码
auto p1 = std::make_shared<int>(10);
auto p2 = p1;
auto p3 = p1;

//此时控制块内:strong count = 3
//当strong count = 0 时,销毁对象 delete ptr

三、weak count(弱引用计数)

表示weak_ptr的数量,另提一嘴weak_ptr是解决循环引用问题的,指向对象资源不会增加强引用计数,因为增加的是弱引用计数。

弱引用计数为0时,控制块这个资源才会释放。

四、deleter(删除器)

用于指定创建的shared_ptr对象是如何释放的,默认是delete,但也可以自定义delete

cpp 复制代码
std::shared_ptr<int> p(new int(10), [](int* x){
    std::cout<<"delete\n";
    delete x;
});

五、allocator(分配器)

用于控制块的内存分配

总结:

shared_ptr 的控制块通常包含被管理对象的指针、强引用计数、弱引用计数、自定义删除器以及分配器等信息。多个 shared_ptr 共享同一个控制块,通过原子操作维护引用计数,当强引用计数为 0 时对象被销毁,当强引用和弱引用都为 0 时控制块才会被释放。

相关推荐
2601_966949653 小时前
为什么量化策略需要大量历史股票数据?从回测可信度理解数据规模
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
niucloud-admin3 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
anew___4 小时前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c
滕州市燕猫虎计算机科技工作室个体工商户4 小时前
Java锁
java·开发语言
多加点辣也没关系4 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
菜鸟~noob2334 小时前
【电子战】 第09篇:阵列信号处理——波束形成、MVDR、MUSIC【含matlab代码】
开发语言·matlab·信号处理
ocean21034 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
零依赖极客5 小时前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm
stolentime5 小时前
洛谷P10515 转圈题解
c++·算法·数学建模·贪心算法
tdtsmt6 小时前
穿戴硬件量产工艺实录:天地通电子智能手表主板 SMT 贴片案
c++