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 时控制块才会被释放。