其他分享
首页 > 其他分享> > 手写 share_ptr

手写 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;
}

 

标签:count,Sharedptr,share,other,operator,手写,ptr,delete
来源: https://www.cnblogs.com/acmLLF/p/14730783.html