智能指针的实现

智能指针的作用,是让使用者更方便的使用指针来申请动态空间,降低出错的可能性。


普通的指针申请动态内存要手动进行new和delete,如果忘记释放内存,则会出现内存泄露。

使用auto_ptr作为动态对象,当auto_ptr对象离开作用域时,其所申请的动态内存将会自动释放。


有了auto_ptr,当你想要为某个T类型申请动态空间时,不去亲自申请空间(T  *p = new T;),而是创建一个auto_ptr对象(auto_ptr obj<T>  pt;)


auto_ptr的接口设计为如下:

// interface
template<class T> class auto_ptr{

	public:
		//构造函数
		explicit auto_ptr(T *p = 0);
		//拷贝构造函数
		template<class U> auto_ptr(auto_ptr<U> &rhs);
		//析构函数
		~auto_ptr();
		//重载赋值运算符
		template<class U> operator=(auto_ptr<U> &rhs);
		

		T& operator*() const;
		T* operator->() const;

		T& get() const;
		
		T* release();

		void reset(T *p = 0);
	
	private:
		// 内部真正的指针
		T *pointee;
		// 将自己设为自己的友元类
		template<class U> friend class auto_ptr<U>;
};

auto_ptr类的实现:

template<class T> class auto_ptr{
	
	public:
		//构造函数
		explicit auto_ptr(T *p = 0):pointee(p) {}
		// 拷贝构造函数
		template<class U> auto_ptr(auto_ptr<U>& rhs):pointee(rhs.release()) {}
		// 析构函数
		~auto_ptr() {delete pointee;}
		// 重载赋值运算符
		template<class U> auto_ptr<T>& operator=(auto_ptr<U> &rhs)
		{
			if(this != rhs)
				reset(rhs.release());
			return *this;
		}
		// 重载指针操作符
		T& operator*() const { return *pointee; }
		// 重载箭头操作符
		T* operator->() const { return pointee; }
		// 获取指针
		T* get() const { return pointee; }
		// 将指针指向空
		T* release()
		{
			T *oldPointee = pointee;
			pointee = 0;
			return oldPointee;
		}
		// 将指针指向p
		void reset(T *p = 0)
		{
			if(pointee != p)
			{
				delete pointee;
				pointee = p;
			}
		}

	private:
		T *pointee;
		template<class T> friend class auto_ptr<U>;
};


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值