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);
}