智能指针
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_ptr
对share_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
为空,返回nullptr
的shared_ptr