简单sharedptr

#include<iostream>

using namespace std;

template<class T>
class SharedPtr {
  private:
    T* ptr_;
    int* pCount_;

  public:
    SharedPtr(T* p) : ptr_(p), pCount_(new int(1)) {}
    SharedPtr(SharedPtr& s) {
      ptr_ = s.ptr_;
      pCount_ = s.pCount_;
      ++(*pCount_);
    }

    T& operator*() {
      return *ptr_;
    }

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

    int getCount() {
      return *pCount_;
    }

    ~SharedPtr() {
      (*pCount_)--;
      if (0 == *pCount_) {
        delete ptr_;
        ptr_ = NULL;
        delete pCount_;
        pCount_ = NULL;
      }
    }
};

class Test {
public:
  Test() : v(0) {
    std::cout << "constructor" << std::endl;
  }

  ~Test() {
    cout << "de-constructor" << std::endl;
  }

  void TestFunc() {
    std::cout << "test func" << std::endl;
  }

  int v;
};

int main() {
  Test *p = new Test();
  SharedPtr<Test> s1(p);
  SharedPtr<Test> s2(s1);

  s1->TestFunc();
  std::cout << "s1 count=" << s1.getCount() << std::endl;
  std::cout << "s2 count=" << s2.getCount() << std::endl;

  return 0;
}

auto_ptr

auto_ptr不能共享所有权

赋值转移所有权后,原autoptr为野指针,会crash

不能指向一组对象

不能与标准容器一起使用

不能通过赋值操作来初始化auto_ptr

 

uniq_ptr

auto_ptr支持拷贝构造与赋值操作,但unique_ptr不直接支持

不提供复制语义(拷贝赋值和拷贝构造都不可以),只支持移动语义(move semantics)

unique_ptr可做为容器元素

unique_ptr可以用在函数返回值中

 

weak_ptr

没有重载opreator*和->操作符,也就意味着即使分配到对象,他也没法使用该对象

从weak_ptr调用lock()可以得到shared_ptr或者直接将weak_ptr转型为shared_ptr

他不像其余三种,可以通过构造函数直接分配对象内存;他必须通过shared_ptr来共享内存

不主动参与引用计数,即,share_ptr释放了,那么weak_ptr所存的对象也释放了

使用成员函数use_count()可以查看当前引用计数,expired()判断引用计数是否为空。

 

shared_ptr

两次从同一个裸指针构造sharedptr,析构会crash

循环引用的问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值