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