简单sharedptr

#include

using namespace std;

template
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 s1(p);
  SharedPtr 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

循环引用的问题

你可能感兴趣的:(C/C++)