shared_ptr是通过指针保持对象共享所有权的智能指针。多个shared_ptr对象可占有同一资源,当最后一个shared_ptr对象被销毁或者通过operator=,reset()操作赋予另一指针时,其管理的资源才会被回收。
管理同一资源的不同shared_ptr对象能在不同线程中不加同步的调用其所有成员函数。当然这里指的是shared_ptr对象本身的成员函数,如果你想多线程访问其管理的资源,那么并不会有这种保证。
其成员类型、成员函数与成员变量等在标准中十分明确,在此不再赘述:https://en.cppreference.com/w...。
shared_ptr也可以指定删除器,但与unique_ptr不同的是,该删除器类型并不作为shared_ptr模板中的参数之一。
C++17之前,shared_ptr管理动态分配的数组需要提供自定义的删除器。c++17可以管理动态数组,例如shared_ptr sp(new int[10])。为了支持这一点,element_type现在被定义为remove_extent_t。
话不多说,我们来看它的源代码实现:
与unique_ptr不同,shared_ptr并未对管理数组对象特化一个版本。
这个类没有成员变量,其数据存储于基类_Ptr_base<_ty>中,在其成员函数中绝大部分操作也是调用基类提供的函数完成。
接下来我们分析一下_Ptr_base基类的实现。_Ptr_base是一个模板类,模板参数是shared_ptr管理的指针对应的类型。该基类拥有如下这两个数据成员:
关于element_type :