智能指针的实现

来源:互联网 发布:下载淘宝帐号注册账号 编辑:程序博客网 时间:2024/04/30 08:09

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


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

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


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


auto_ptr的接口设计为如下:

// interfacetemplate<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;}// 将指针指向pvoid reset(T *p = 0){if(pointee != p){delete pointee;pointee = p;}}private:T *pointee;template<class T> friend class auto_ptr<U>;};


0 0