手撸一个简单的shared_ptr

首先先要明确shared_ptr的定义

就是有多个对象指向同一块内存地址,大家都能访问该内存地址,当对象都被释放的时候释放该块内存,那么该类除了指向内存地址的指针外,还需要一个计数器,为了让所有对象计数器的值相等,所以还需要一个计数器指针,当然这是一个模板类,综上,我们应该这样写

template
class shared_ptr
{
  public:
    shared_ptr(T x) {
      num_ptr = new int (1);
      data_ptr = new T (x);
    }
    ~shared_ptr() {
      *num_ptr--;
      if(*num_ptr==0){
        delete data_ptr;
      }
    }
  private:
    int* num_ptr = nullptr;
    T* data_ptr = nullptr;
};

对于一个shared_ptr对象而言,只有在建立时才需要为两个指针分配内存,当最后一个指向相同地址的对象析构时才释放两个指针的内存,

指向相同地址的shared_ptr只能通过复制,那么很显然,我们需要重写赋值构造函数和拷贝构造函数

shared_ptr(const shared_ptr& other) {
  num_ptr = other.get_num_ptr();
  (*num_ptr)++;
  data_ptr = other.get_data_ptr();
}
shared_ptr& operator=(const shared_ptr& other){
  num_ptr = other.get_num_ptr();
  (*num_ptr)++;
  data_ptr = other.get_data_ptr();
  return *this;
}

知识点复习:为什么拷贝构造函数一定要用引用呢

ok其实基本已经写完了,当然为了访问当指针的内存地址,我们还需要重写运算符*, ->

T operator* ()
{
  return *data_ptr;
}
T *operator->(){
  return data_ptr;
}

ok

完成

有机会一定看看源码再学学(别想了,我懒得不可能再看的)

你可能感兴趣的:(c++,开发语言,数据结构)