由于上一篇博客将shared_ptr,weak_ptr,enable_shared_form_this的源码实现整理了一遍,想着cpp智能指针还差个unique_ptr故写下此篇博客,以供学习
源码剖析
一,模板参数
首先,我们先看unique_ptr的模板参数,第一个参数_TP自是不用说表示对象类型,第二个模板参数定义了unique_ptr的删除器,typename _Dp = default_delete<_Tp>,这里自带了一个默认删除器,我们先看看默认删除器会做什么实现,

可以看见默认删除器,就是直接将unique_ptr所持有的资源直接delete.

内存布局
接下来我们再看看unique的内存布局,可以看见是由一个__uniq_ptr_data的模板类管理这对象以及删除器,通过类继承的抽丝剥茧,可以发现最后是__uniq_ptr_impl类包含一个元组,其参数为对象指针和删除器


template <typename _Tp, typename _Dp>class __uniq_ptr_impl {using pointer = typename _Ptr<_Tp, _Dp>::type;private:tuple<pointer, _Dp> _M_t;}
maek_unique
这里可以看见,make_unique是直接new了一个对象,将指针交给unique_ptr进行管理,并没有使用STL空间配置器,原因在末尾总结说明

总结
unique_ptr的删除器默认使用delete直接释放内存unique_ptr与shared_ptr不同,unique_ptr有删除器,shared_ptr没有unique_ptr底层使用tuple<pointer, 删除器>存储相关信息,由于是独占式,所以没有引用计数
uple<pointer, 删除器>`存储相关信息,由于是独占式,所以没有引用计数make_unique使用new创建一个对象,而不是STL空间配置器,原因是unique_ptr的默认删除器使用delete