记录一下我对智能指针std::shared_ptr的理解和体会。温故而知新。 底层实现逻辑 控制块 按照我的理解,std::shared_ptr的底层实现逻辑涉及两个主要的概念:控制块(control block)和引用计数(reference counting)。(如上图所示) 控制块(Control Block) 每个std::shared_ptr管理的对象都有一个关联的控制块。这个控制...
每个shared_ptr都占指针的两倍空间,一个装着原始指针,一个装着计数区域(SharedPtrControlBlock)的指针 用原始指针构造时,会new一个SharedPtrControlBlock出来作为计数存放的地方,然后用指针指向它,计数加减都通过SharedPtrControlBlock指针间接操作 这其中包含两个Count变量,weak count是用于weak_ptr的弱引用计数(weak_ptr...
1.shared_ptr中的control block是线程安全的 shared_ptr ref_count所指的部分即使control block 所以如下情况,操作control block是线程安全的,对data_ptr只有指针的读取 一个全局的shared_ptr shared_ptr<int>global_ptr; 线程1到N运行: voidthreadFunc(){shared_ptr<int>local=shared_ptr=global_ptr;} 这一部分...
shared_ptr 内部包含两个指针,一个指向对象,另一个指向控制块(control block),控制块中包含一个引用计数(reference count), 一个弱计数(weak count)和其它一些数据。 简单来说,shared_ptr实现包含了两部分: - 一个指向堆上创建的对象的裸指针,raw_ptr - 一个指向内部隐藏的、共享的管理对象。share_count_objec...
黄色方框表示shared_ptr内部有一个指向对象本身的裸指针(如 0x0000000000416ec0),这个指针指向了一个整型对象(值为7,绿色方框所示)。此外,shared_ptr还包含或指向一个控制块(control block),该控制块通过另一个内部指针(如 0x0000000000416eb0)访问,用于管理对象的引用计数和其他可能的元数据。
class SharedPtrControlBlock { template <typename T> friend class shared_ptr; template <typename T> friend class weak_ptr; private: SharedPtrControlBlock() : refcount_(1), weak_count_(1) { } int refcount_; int weak_count_; };
通过调试分析可以看出,shared_ptr类型的变量占用的内存大小为16字节,包含两个裸指针的大小:一个指向管理的对象,另一个指向控制块(Control Block)。控制块中存储了引用计数和其他元数据,用于跟踪和管理shared_ptr所指向的对象。 例如,在64位系统下,shared_ptr变量sp包含两个重要的指针:一个低地址部分指向实际对象,另...
std::shared_ptr 使用控制块(control block)来跟踪有多少个 shared_ptr 实例指向同一个对象。控制块中包含一个计数器(通常称为引用计数),用于记录当前有多少个 shared_ptr 指向该对象。当一个新的 shared_ptr 实例被创建并指向该对象时,计数器递增;当一个 shared_ptr 实例被销毁或重置时,计数器递减。当计数器...
因为引用计数是另一个更大的数据结构的一部分,那个数据结构通常叫做控制块(control block)。每个std::shared_ptr管理的对象都有个相应的控制块。控制块除了包含引用计数值外还有一个自定义删除器的拷贝,当然前提是存在自定义删除器。如果用户还指定了自定义分配器,控制块也会包含一个分配器的拷贝。
4. shared_ptr对象的引用计数实际上是存储在一个辅助对象(control block)中。该辅助对象包含指向动态分配对象的指针,以及引用计数。 5. 当shared_ptr对象被拷贝构造或者赋值时,新的shared_ptr对象会和原先的shared_ptr对象共享同一个辅助对象。这样一来,它们的引用计数也是共享的。