C++ unique_ptr的模拟实现

一、unique_ptr的模拟实现

在之前的博客中,我说过auto_ptr的缺陷,所以为了避免auto_ptr的缺陷,所以unique_ptr用了一个简单粗暴的办法:防拷贝、防赋值。既然auto_ptr在拷贝和赋值的时候,会出现一些问题,那么在unique_ptr中就不让他进行拷贝和赋值。

那么如何禁止它拷贝和赋值呢?
我们都知道,如果我们没有定义拷贝构造和赋值运算符重载函数时,编译器会为其生成默认的拷贝构造和赋值运算符重载。所以我们可以用下面两种办法来实现禁止拷贝和赋值。
方法一: 在C++98中
将拷贝构造和赋值运算符重载声明为私有成员并且只声明不定义。但是这又一个缺陷,那就是可以通过友元函数来访问。
方法二: 在C++11中
在函数声明后面加上“=delete”,来显式的禁用掉该函数

	template<class T>
	class Unique_ptr
	{
	public:
		Unique_ptr(T* _ptr=nullptr)
		:ptr(_ptr)
		{}

		Unique_ptr()
		{
			if (ptr != nullptr)
				delete ptr;
		}

		T& operator*()
		{
			return *ptr;
		}

		T* operator->()
		{
			return ptr;
		}

	private:
		T * ptr;

		//C++98中
		Unique_ptr(UniquePtr<T> const &);
		Unique_ptr & operator=(UniquePtr<T> const &);
		
		//C++11中
		Unique_ptr(Unique_ptr<T> const& up)=delete;
		Unique_ptr<T>& operator=(Unique_ptr<T> const& up)=delete;		
	};
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
unique_ptrC++11 标准提供的智能指针,用于管理动态分配的对象。它使用了独占所有权的概念,保证了在不再需要指针时自动释放资源,从而避免了内存泄漏。 手撕 unique_ptr实现涉及到指针的拷贝和移动语义。下面是一个简单的手撕 unique_ptr 的示例代码: ```cpp template <typename T> class unique_ptr { public: explicit unique_ptr(T* ptr = nullptr) : ptr_(ptr) {} ~unique_ptr() { delete ptr_; } unique_ptr(const unique_ptr&) = delete; // 禁用拷贝构造函数 unique_ptr& operator=(const unique_ptr&) = delete; // 禁用拷贝赋值运算符 unique_ptr(unique_ptr&& other) noexcept : ptr_(other.ptr_) { other.ptr_ = nullptr; } unique_ptr& operator=(unique_ptr&& other) noexcept { if (this != &other) { delete ptr_; ptr_ = other.ptr_; other.ptr_ = nullptr; } return *this; } T& operator*() const { return *ptr_; } T* operator->() const { return ptr_; } T* get() const { return ptr_; } private: T* ptr_; }; ``` 上述代码中,我们定义了一个类模板 `unique_ptr`,它模拟了标准库中的 `std::unique_ptr` 功能。在构造函数中,我们接受一个指针作为参数,并将其保存在 `ptr_` 成员变量中。析构函数负责释放指针所指向的资源。为了遵循独占所有权的原则,我们禁用了拷贝构造函数和拷贝赋值运算符,而使用移动语义来实现赋值操作。`operator*` 和 `operator->` 用于重载解引用操作符,方便使用指针指向的对象。 需要注意的是,上述实现只是一个简单的手撕版 unique_ptr,并没有处理更复杂的边界情况和异常安全性。在实际使用中,建议使用标准库提供的 `std::unique_ptr`,它已经经过了充分测试和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值