unique_ptr

7 篇文章 0 订阅
4 篇文章 0 订阅

unique_ptr

class unique_ptr

template <typename _Tp, typename _Dp = default_delete<_Tp>> class unique_ptr

成员变量

  class _Pointer {
    template <typename _Up>
    static typename _Up::pointer __test(typename _Up::pointer *);

    template <typename _Up> static _Tp *__test(...);

    typedef typename remove_reference<_Dp>::type _Del;

  public:
    typedef decltype(__test<_Del>(0)) type;
  };

  typedef std::tuple<typename _Pointer::type, _Dp> __tuple_type;
  __tuple_type _M_t;

public:
  typedef typename _Pointer::type pointer;
  typedef _Tp element_type;
  typedef _Dp deleter_type;

成员函数

 	constexpr unique_ptr() noexcept : _M_t() {
      static_assert(!is_pointer<deleter_type>::value,
                    "constructed with null function pointer deleter");
    }

    explicit unique_ptr(pointer __p) noexcept : _M_t(__p, deleter_type()) {
      static_assert(!is_pointer<deleter_type>::value,
                    "constructed with null function pointer deleter");
    }



	pointer get() const noexcept { return std::get<0>(_M_t); }


//unqiue_ptr还定义了两个很重要的函数:reset(pointer)和release()。reset(pointer)的功能是用一个新指针替换原来的指针,而release()则是是放弃原生指针的所有权。

  pointer release() noexcept {
      pointer __p = get();
      std::get<0>(_M_t) = pointer();
      return __p;
    }

    void reset(pointer __p = pointer()) noexcept {
      using std::swap;
      swap(std::get<0>(_M_t), __p);
      if (__p != pointer())
        get_deleter()(__p);
    }


    typename add_lvalue_reference<element_type>::type operator*() const {
      _GLIBCXX_DEBUG_ASSERT(get() != pointer());
      return *get();
    }


 pointer operator->() const noexcept {
      _GLIBCXX_DEBUG_ASSERT(get() != pointer());
      return get();
    }



  ~unique_ptr() noexcept {
      auto &__ptr = std::get<0>(_M_t);
      if (__ptr != nullptr)
        get_deleter()(__ptr);
      __ptr = pointer();
    }

deleter_type &get_deleter() noexcept { return std::get<1>(_M_t); }

default_delete

template <typename _Tp> struct default_delete

成员函数

void operator()(_Tp *__ptr) const {
  static_assert(sizeof(_Tp) > 0, "can't delete pointer to incomplete type");
  delete __ptr;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海洋2416

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值