智能指针—AutoPtr,ScopedPtr,SharedPtr的模拟实现

来源:互联网 发布:手机淘宝背景怎么设置 编辑:程序博客网 时间:2024/05/17 04:24

智能指针: 所谓智能指针就是智能/⾃动化的理指针所指向的动态资源的释放
AutoPtr:最简单的智能指针
首先我们先提一下RAII,资源获得即初始化(利用类的构造函数来进行初始化和析构函数释放资源)
下面我们来模拟实现以下AutoPtr

//智能指针AutoPtrtemplate <class T>class AutoPtr{pubilc:    AutoPtr (T * ptr)        :_ptr(ptr)    { }    ~AutoPtr()    {        cout << "delete" << _ptr << endl;        if (_ptr)        {            delete _ptr;            _ptr = NULL;        }    }private :    T = _ptr;}

如果执行会发现以上代码是有问题的,拷贝构造函数和赋值运算符重载是系统默认的,系统默认情况下是值拷贝,存在一块空错放两次及以上的情况,导致程序运行错况。
在这里,采用的方法是管理权的转移。

AutoPtr(AutoPtr<T>& ap){//管理权的转移this->_ptr=ap._ptr;ap._ptr=NULL;}

但是还是尽量不要使用它,其是存在缺陷的。
ScoPedPtr:简单粗暴—防拷贝(只声明不定义)

template <class T>  class ScopedPtr  {  public:       ScopedPtr(T * ptr)           :_ptr(ptr)       { }       ~ScopedPtr()       {           cout << "delete" << endl;           if (_ptr)           {               delete _ptr;               _ptr = NULL;           }       }       T & operator*()       {           return *_ptr;        }       T* operator->()      {           return _ptr;       }       T* GetPtr()      {          return _ptr;      }  protected:     //防止拷贝      ScopedPtr(ScopedPtr<T> & ap);      ScopedPtr<T> & operator=(ScopedPtr<T> & ap);  private:      T * _ptr;  };  

SharedPtr:利用引用计数的浅拷贝来实现 缺陷为循环引用(weak_ptr配合解决)

template <class T>  //智能指针sharedptr  class SharedPtr  {  public:      SharedPtr(T * ptr)         :_ptr(ptr)         , _pcount(new long(1))      { }      ~SharedPtr()      {          cout << "delete" << endl;          if (--(*_pcount) == 0)          {              delete _ptr;              delete _pcount;          }      }      SharedPtr(SharedPtr<T> & ap)         :_ptr(ap._ptr)         , _pcount(ap._pcount)      {          ++(*_pcount);      }      SharedPtr<T> & operator=(SharedPtr<T> & ap)     {         if (this != &ap)         {             if (--(*_pcount) == 0)             {                 delete _ptr;                 delete _pcount;             }             _ptr = ap._ptr;             _pcount = ap._pcount;             ++(*_pcount);         }         return *this;      }  private:      T * _ptr;      long *_pcount;    //实现引用计数  };  
0 0
原创粉丝点击