浅析 shared_ptr:MSVC STL 篇
序言请移步此处
因为这是系列第一篇,所以会带一些功能的 demo,以方便叙述。
How shared_ptr(new T()) differs from make_shared()
首先考虑 shared_ptr
对象的创建,对于给定类型 T
,假设通过
1 | auto ptr = std::make_shared<T>(...); |
创建一个实例。
看一下函数代码:
1 | template<class _Ty, |
这里首先在 heap 上创建了一个 _Ref_count_obj<_Ty>
对象,通过 std::forward()
将 make_shared()
的参数转发作为构造函数;接着通过 default contructor 创建了一个 shared_ptr<_Ty>
,并调用 _Set_ptr_rep_and_enable_shared()
设置相关数据。
因为创建 _Ty
实例需要的参数 _Args
被转发到了 _Ref_count_obj
的构造函数中,且 shared_ptr
的 default constructor 实质上是一个 _constexpr function_,因此猜测 shared_ptr
自身并不负责创建其管理的 object instance,而是将这部分操作“委托”给 _Ref_count_obj
。