unique_ptr 与 shared_ptr 的 deleter

使用std::unique_ptr<>定义(声明)一个对象的时候,需要知道这个对象的Deleterstd::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里面保存的是对象的allocatordeleteratomic 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);
}

reference

posted @ 2023-08-04 11:38  山岚2013  阅读(94)  评论(0编辑  收藏  举报