跳到主要内容

智能指针

unique_ptr

template<
class T,
class Deleter = std::default_delete<T> // 删除器
> class unique_ptr;

通过指针占有并管理另一对象,在unique_ptr离开作用域时释放该对象的智能指针。

在下列两者之一发生时用关联的删除器释放对象:

  • 销毁了管理的 unique_ptr 对象
  • 通过 operator=reset() 赋值另一指针给管理的 unique_ptr 对象。

使用

  • 通过std::make_unique()(C++14),创建unique_ptr对象。
  • get()获取指向资源的原始指针
  • reset()释放资源,并且将unique_ptr指针置零
  • release()不释放资源,将unique_ptr指针置零,并返回资源原始指针

shared_ptr

template< class T > class shared_ptr;

std::shared_ptr 是通过指针保持对象共享所有权的智能指针。多个 shared_ptr 对象可占有同一对象。下列情况之一出现时销毁对象并解分配其内存:

  • 最后剩下的占有对象的 shared_ptr 被销毁;
  • 最后剩下的占有对象的 shared_ptr 被通过 operator=reset() 赋值为另一指针。

注意

  • shared_ptr只能通过复制构造或复制赋值给另一shared_ptr,用另一shared_ptr占有原始底层指针将导致未定义行为。

成员函数(部分)

  • owner_before: 判断两个指针是否指向同一对象

weak_ptr

template< class T > class weak_ptr;

weak_ptrshare_ptr管理的对象存在若引用。在访问对象前必须先转换为shared_ptr

特点

  • weak_ptr不会增加引用计数。
  • 当某个对象只有存在时才需要被访问,而且随时可能被他人删除时,可以使用weak_ptr来跟踪。需要获得临时所有权时,则将其转换为shared_ptr,此时如果原来的shared_ptr被销毁,则该对象的生命周期将被延长至这个临时的shared_ptr同样被销毁为止。
  • weak_ptr可以打断shared_ptr对象组成的环状引用,若这种环被孤立(例如无指向环中的外部共享指针),则shared_ptr引用计数无法抵达零,而内存被泄露。能令环中的指针之一为弱指针以避免此情况。

成员函数(部分)

  • reset: 释放被管理对象的所有权
  • use_count: 返回管理该对象的share_ptr对象数量
  • expired: 检查被引用对象是否被删除,等价于user_count() == 0, 可能仍未对被管理对象调用析构函数,但对象的析构已经临近。被管理对象在多线程共享时false不可靠,true可靠
  • lock: 创建管理被引用的对象的shared_ptr, 等效地返回expired() ? shared_ptr<T>() : shared_ptr<T>(*this), 原子地执行。即无被管理对象时,this为空,返回nullptrshared_ptr