鉴于auto_ptr 所出现的无法复制,且不能满足标准容器对元素的要求,所以boost库中提供了一种新型的智能指针 shared_ptr,它通过引用计数(reference counting)的原理,解决了多个指针之间共享对象所有权的问题,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。
shared_ptr也可以安全地放到标准容器中,并弥补了auto_ptr因为转移语义而不能把指针作为STL容器元素的缺陷。
在C++11中,shared_ptr 在<memory>中被定义为:
template< class T > class shared_ptr;
std::shared_ptr 是通过指针保持某个对象的共享拥有权的智能指针。若干个 shared_ptr 对象可以拥有同一个对象;最后一个指向该对象的 shared_ptr 被销毁或重置时,该对象被销毁。销毁该对象时使用的是 delete 表达式或者是在构造 shared_ptr 时传入的自定义删除器(deleter)。
shared_ptr 也可以不拥有对象,称作空(empty)。
shared_ptr 满足 CopyConstructible 和 CopyAssignable 的要求。
shared_ptr实现细节
成员类型 | 定义 |
---|---|
element_type T | The type of the managed object,即被shared_ptr管理着的对象 |
包含的成员函数如下所示:
成员函数 | 说明 |
---|---|
(constructor) | constructs new shared_ptr |
(destructor) | 如果没有更多shared_ptrs的的链接解构拥有的对象 |
operator= | 分配shared_ptr |
reset | 取代管理的对象 |
swap | 交换所管理的对象 |
get | 返回一个指针,指向被管理对象 |
operator* ;operator-> | 解引用指针到的管理对象 |
use_count | 返回shared_ptr对象指的是在同一个管理对象的数量 |
unique | 检查是否被管理对象的管理仅由当前shared_ptr的实例 |
operator bool | 检查是否有相关的管理对象 |
owner_before | Owner-based ordering |