C++智能指针unique_ptr

unique_ptr是C++11引入的智能指针之一,它确保了每个unique_ptr对象对资源的唯一拥有。unique_ptr不可拷贝,但可移动,支持删除器类型,并能与STL容器配合使用。其设计旨在解决auto_ptr的问题,提供更安全的资源管理方式。
摘要由CSDN通过智能技术生成

0. 引言

上一篇文章介绍了auto_ptr,由于auto_ptr存在着诸多问题,C++11引入了三个新的智能指针unique_ptrshared_ptrweak_ptr,本文介绍unique_ptr

1. unique_ptr的特点

unique_ptr实现了独享被管理资源指针的概念,顾名思义,它确保了一个unique_ptr对象与一个资源的唯一对应。unique_ptr有以下一些特点:

  1. 两个unique_ptr不会指向同一个资源;
  2. unique_ptr类型不提供拷贝构造函数和左值赋值函数重载;
  3. 但提供移动构造函数和移动赋值函数;
  4. 相对于auto_ptrunique_ptr添加了删除器类型;
  5. 可以与STL中的容器配合使用;
  6. 在用法上和普通指针的用法类似,也提供了*和->运算符。

2. unique_ptr的分析

下面的代码对unique_ptr类型进行了简单仿写,展示了unique_ptr的使用特点。

//删除器仿写,处理单个对象
template<class _Ty>
struct default_deleter
{
	void operator()(_Ty* ptr) const
	{
		delete ptr;		//删除单个对象
	}
};
//处理一组对象
template<class _Ty>
struct default_deleter<_Ty[]>
{
	void operator()(_Ty* ptr) const
	{
		delete[]ptr;	//删除一组对象
	}
};
//unique_ptr的泛化版本,该模板只能处理单个对象
template<class _Ty, class _Dx = default_deleter<_Ty>>
class unique_ptr
{
public:
	using pointer = _Ty*;
	using element_type = _Ty;
	using deleter_type = _Dx;
private:
	pointer mPtr;
	deleter_type mDeleter;
public:
	unique_ptr(pointer ptr = nullptr) :mPtr(ptr) {}

	~unique_ptr()
	{
		reset();
	}
	//返回删除器对象
	_Dx& get_deleter() const
	{
		return mDeleter;
	}

	const _Dx& get_deleter() const
	{
		return mDeleter;
	}
	//替换被管理对象
	void reset(pointer ptr = nullptr)
	{
		if (mPtr != nullptr)
		{
			mDeleter(mPtr);
		}
		mPtr = ptr;
	}
};
//unique_ptr部分特化版本,该版本处理一组对象
template<class _Ty, class _Dx>
class unique_ptr<_Ty[], _Dx>
{
public:
	using pointer = _Ty*;
	using element_type = _Ty;
	using deleter_type = _Dx;
private:
	pointer mPtr;
	deleter_type mDeleter;
public:
	unique_ptr(pointer ptr = nullptr) :mPtr(ptr) {}

	~unique_ptr()
	{
		reset();
	}

	void reset(pointer ptr = nullptr)
	{
		if (mPtr != nullptr)
		{
			mDeleter(mPtr);
		}
		mPtr = ptr;
	}

	_Dx& get_deleter()
	{
		return mDeleter;
	}

	const _Dx& get_deleter() const
	{
		return mDeleter;
	}

	element_type& operator*() const = delete;

	pointer operator->() const = delete;

	pointer get() const
	{
		return mPtr;
	}

	element_type& operator[](size_t i) const
	{
		return get()[i];
	}
};

3. unique_ptr的总结

总的来说,unique_ptr就是一个添加了删除器的auto_ptr,用于管理一组对象,并引入了右值引用的概念。unique_ptr不允许拷贝构造和左值赋值,但提供了移动构造和移动赋值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值