unique_ptr简单实现和析构函数delete指针的原因

模板类

定义一个如下的UniquePtr模板类,使得可以使用UniquePtr托管各种类型的指针。类中包含一个T *ptr用于存储要托管的指针。

template<typename T>
class UniquePtr {
// ...
private:
    T *ptr;
};

//构造函数
UniquePtr(T *ptr = nullptr) : ptr(ptr) {}
//析构
~UniquePtr() {
    if (ptr) {
        delete ptr;
        ptr = nullptr;
    }
}
//禁用拷贝构造和赋值运算符
//由于UniquePtr对象托管的指针是独享的,
//拷贝构造和赋值操作会有歧义,因此使用如下方式禁用。
UniquePtr(const UniquePtr &p) = delete;
UniquePtr &operator=(const UniquePtr &p) = delete;
//移动构造函数
UniquePtr(UniquePtr &&p) noexcept: ptr(p.ptr) {
    p.ptr = nullptr;
}

移动构造函数

UniquePtr支持移动构造。使用移动构造函数构造新对象后,原对象所托管指针将被转移到新对象上

从下面代码段可以看出左边的新对象构造以后,所托管的指针将与右边的原对象脱离,右对象的ptr_置nullptr。这也是为什么该类智能指针被称为unique_ptr的原因。因为所托管的指针只能由一个UniquePtr对象独享。

// Move constructor.
UniquePtr(UniquePtr &&p) noexcept: ptr(p.ptr) {
    p.ptr = nullptr;
}

类成员访问运算符(->)

为了让使用UniquePtr对象就像使用所托管指针一样,可以直接使用->访问托管指针对应类中成员,需要对operator->进行重写

// Return the stored pointer.
T *operator->() const noexcept { return ptr; }

析构函数为什么要调用delete

贴一下源码

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

unique_ptr(非静态类)在调用构造函数之前,不占用堆栈空间,unique_ptr在调用构造函数时,需要传入一个参数,这个参数通常是new出来的,因此需要delete

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值