unique_ptr 与 shared_ptr 的 deleter
使用std::unique_ptr<>定义(声明)一个对象的时候,需要知道这个对象的Deleter,std::unique_ptr的原型如下:
template<
class T,
class Deleter = std::default_delete<T>
> class unique_ptr;
如果在定义/声明一个unique_ptr对象的时候,这个对象是imcomplete type,因为default deleter的实现中需要使用sizeof(object),不能确定对象的大小,所以编译报错:
`error: invalid application of 'sizeof' to an incomplete type 'student'`
使用std::shared_ptr<>,shared_ptr里面的数据结构跟unique_ptr不一样,shared_ptr里面保存的是对象指针,以及一个指向control block的指针,所以在申明/定义的时候,可以不需要知道对象的完整类型。control block里面保存的是对象的allocator,deleter,atomic reference等成员。

源码如下:
```plaintext
costexpr __shared_ptr()
: _M_ptr(0), _M_refcount() // never throws
{ }
template<typename _Tp1>
explicit __shared_ptr(_Tp1* __p)
: _M_ptr(__p), _M_refcount(__p) {
__glibcxx_function_requires(_ConvertibleConcept<_Tp1*, _Tp*>)
static_assert( sizeof(_Tp1) > 0, "incomplete type" );
__enable_shared_from_this_helper(_M_refcount, __p, __p);
}

浙公网安备 33010602011771号