智能指针

  • 智能指针分配在栈中,但是指向的对象在堆中
  • 智能指针的ref count是线程安全的,但是修改数据,数据是线程不安全的

shared_ptr

  • 内部存在两个指针
    • 一个指向分配的对象
    • 一个指向控制块
      • reference count(引用计数)
      • weak count(弱计数)
      • other data(custom deleter, allocator)
shared_ptr<Buffer> buf1 = std::make_shared<Buffer>("Hello world");
shared_ptr<Buffer> buf2 = buf1; // 两个shared_ptr指向的内容相同,只是引用计数增加

unique_ptr

  • 独占指针,没有copy语义

weak_ptr

解决的问题

  • 可以解决shared_ptr循环引用的问题(A指向B,B指向A)
  • 多线程环境下, 先锁定资源(lock), 再判断资源是否可用(expire);