手写 share_ptr

#include<bits/stdc++.h>
 
using namespace std;
 
template <typename T>
class Sharedptr {
public:
  //空参数构造, 空指针
  Sharedptr():count(0), ptr((T*) 0){}
  //构造函数 count 必须new出来
  Sharedptr(T* p) : count(new int(1)), ptr(p){}
  //拷贝构造函数,使其引用次数加一
  Sharedptr(Sharedptr<T>& other) : count(&(++ *other.count)), ptr(other.ptr){}
  //重载operator*和operator->实现指针功能
  T* operator->() { return ptr;}
  T& operator*() { return *ptr; }
  //重载operator =
  //如果原来的sharedptr已经有对象,则让其引用对象次数减一并判断引用是否为零(是否调用delete),然后将新的引用对象次数加一
  Sharedptr<T>& operator = (Sharedptr<T>& other) {
    if (this == &other) return *this;
    ++* other.count;
    if (this->ptr && 0 == -- * this->count) {
      delete count;
      delete ptr;
      cout << "delete ptr =" << endl;
    }
    this->ptr = other.ptr;
    this->count = other.count;
    return *this;
  }
  //析构函数 使用引用次数减一并判断引用是否为零,即是否调用delete
  ~Sharedptr() {
    if (ptr && -- * count == 0) {
      delete count;
      delete ptr;
      cout << "delete ptr ~" << endl;
    }
  }
  int getRef() {
    return *count;
  }
private:
  int* count;
  T* ptr;
};
 
int main(int argc, const char* argv[]) {
  Sharedptr<string> pstr(new string("abc"));
  cout << "pstr:" << pstr.getRef() << " " << *pstr << endl;
 
  Sharedptr<string> pstr2(pstr);
  cout << "pstr:" << pstr.getRef() << " " << *pstr << endl;
  cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl;
 
  Sharedptr<string> pstr3(new string("hao"));
  cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl;
  
  pstr3 = pstr2;
  cout << "pstr:" << pstr.getRef() << " " << * pstr << endl;
  cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl;
  cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl;
 
  return 0;
}

 自己版本:

#include<bits/stdc++.h>

using namespace std;

template <typename T>
class shareptr
{

    public :
    shareptr(): count(0),ptr((T*)0){}
    shareptr(shareptr<T>& x) 
    {
         count=x.count;
         (*count)++;
         ptr=x.ptr;
    }
    shareptr<T>& operator =(shareptr<T>& x)
    {
       
        int xx=--(*count);
        if(xx==0)
        {
            delete ptr;
            delete count;
        }
        count=x.count;
        (*count)++;
        ptr=x.ptr;
        return *this;
    }
    shareptr(T* x)
    {   
        count=new int(1);
        ptr=x;
    }
    ~shareptr()
    {
        (*count)--;
        if((*count)==0)
        {
            delete count;
            delete ptr;
        }
    }
    T& operator *()
    {
        return *ptr;
    }
    T* operator ->()
    {
        return ptr;
    }
    int getRef()
    {
        return *count;
    }

private:
    int *count ;
    T* ptr;

};
int main()
{

  shareptr<string> pstr(new string("abc"));
  cout << "pstr:" << pstr.getRef() << " " << *pstr << endl;
 
  shareptr<string> pstr2(pstr);
  cout << "pstr:" << pstr.getRef() << " " << *pstr << endl;
  cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl;
 
  shareptr<string> pstr3(new string("hao"));
  cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl;
  
  pstr3 = pstr2;
  cout << "pstr:" << pstr.getRef() << " " << * pstr << endl;
  cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl;
  cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl;
 
  return 0;
}
原文地址:https://www.cnblogs.com/acmLLF/p/14730783.html