智能指针的实现

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


普通的指针申请动态内存要手动进行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>;
};


你可能感兴趣的:(智能指针的实现)