实现c++智能指针

改造一下标准库里的share指针

// 需要一个结构体保存计数器和裸指针
template <typename T>
struct Conptr {
    T * ptr;
    unsigned int Counter;
};
 
template <class T>
class shared_ptr {
    public:
      Conptr<T> * ptr;

      // 允许通过 () 或者 = 传入指针
      shared_ptr(T *aptr){
        ptr = new Conptr<T>;
        ptr->ptr = aptr;
        ptr->Counter = 1;
      }
      // 允许复制构造
      shared_ptr(const shared_ptr<T*> & aptr){
        ptr = aptr->ptr;
        ptr->Counter ++;
      }
      ~shared_ptr(){
        ptr->Counter --;
        if(ptr->Counter == 0){
            delete ptr->ptr;
            delete ptr;
        }
      }
 
      T * const operator -> (){
          return ptr->ptr;
      }
      // 禁止循环构造
      shared_ptr & operator = (shared_ptr & aptr) = delete;
      // 禁止生成裸指针
      shared_ptr() = delete;
      // 通过get()得到值,而不是指针
      T & get(){
        return * (ptr->ptr);
      }

};

class test{
public:
  test(){std::cout<<"create an obj of the test class";}
  ~test(){std::cout<<"delete the obj";}

};

int main(){
  shared_ptr ptr = new int;
  ptr.get() = 10;
  std::cout << ptr.get();
  shared_ptr ptr2 = ptr;

  {
    shared_ptr tp = new test;
  }

  auto test_for_function [&](const shared_ptr & p){
    share_ptr t = p;
    return t;
  }

  shared_ptr tp2 = test_for_function();

  ptr2 = ptr; // error
  shared_ptr<int> ptr3; // error
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值