由于上一篇博客将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