std::shared_ptr
来自cppreference.com
在头文件 <memory> 中定义
|
||
template< class T > class shared_ptr; |
(C++11 起) | |
std::shared_ptr
是通过指针保持某个对象的共享拥有权的智能指针。若干个 shared_ptr
对象可以拥有同一个对象;最后一个指向该对象的 shared_ptr
被销毁或重置时,该对象被销毁。销毁该对象时使用的是 delete 表达式或者是在构造 shared_ptr
时传入的自定义删除器(deleter)。
shared_ptr
也可以不拥有对象,称作空(empty)。
shared_ptr
满足 CopyConstructible
和 CopyAssignable
的要求。
目录 |
[编辑] 成员类型
成员类型 | 定义 |
element_type | T |
[编辑] 成员函数
constructs new shared_ptr (公共成员函数) | |
解构拥有的对象如果没有更多 shared_ptr s的的链接 原文: destructs the owned object if no more shared_ptr s link to it (公共成员函数) | |
分配 shared_ptr (公共成员函数) | |
| |
取代管理的对象 (公共成员函数) | |
掉期所管理的对象 (公共成员函数) | |
| |
返回一个指针,指向被管理对象 原文: returns a pointer to the managed object (公共成员函数) | |
解引用指针到的管理对象 原文: dereferences pointer to the managed object (公共成员函数) | |
返回 shared_ptr 对象指的是在同一个管理对象的数量 原文: returns the number of shared_ptr objects referring to the same managed object (公共成员函数) | |
检查是否被管理对象的管理仅由当前 shared_ptr 的实例 原文: checks whether the managed object is managed only by the current shared_ptr instance (公共成员函数) | |
检查是否有相关的管理对象 原文: checks if there is associated managed object (公共成员函数) | |
业主基于订购的共享指针 原文: provides owner-based ordering of shared pointers (公共成员函数) |
[编辑] 非成员函数
创建一个共享管理一个新的对象的指针,该指针 原文: creates a shared pointer that manages a new object (函数模板) | |
创建一个共享指针管理使用分配器分配一个新的对象 原文: creates a shared pointer that manages a new object allocated using an allocator (函数模板) | |
(函数模板) | |
返回指定类型的删除,如果拥有 原文: returns the deleter of specified type, if owned (函数模板) | |
与另一个 shared_ptr 或nullptr 原文: compares with another shared_ptr or with nullptr (函数模板) | |
托管指针的值输出到输出流中 原文: outputs the value of the managed pointer to an output stream (函数模板) | |
(C++11) |
专业的std::swap算法 原文: specializes the std::swap algorithm (函数模板) |
专业原子操作 (函数模板) |
[编辑] Helper类
(C++11) |
std::shared_ptr的哈希支持 (类模板特化) |
[编辑] 实现说明
在典型的实现中,std::shared_ptr 只保存两个指针:
- 指向被管理对象的指针
- 指向控制块(control block)的指针
控制块是一个动态分配的对象,其中包含:
- 指向被管理对象的指针或被管理对象本身
- 删除器
- 分配器(allocator)
- 拥有被管理对象的
shared_ptr
的数量 - 引用被管理对象的
weak_ptr
的数量
通过 std::make_shared 和 std::allocate_shared 创建 shared_ptr
时,控制块将被管理对象本身作为其数据成员;而通过构造函数创建 shared_ptr
时则保存指针。
shared_ptr
持有的指针是通过 get()
返回的;而控制块所持有的指针/对象则是最终引用计数归零时会被删除的那个。两者并不一定相等。
shared_ptr
的析构函数会将控制块中的 shared_ptr
计数器减一,如果减至零,控制块就会调用被管理对象的析构函数。但控制块本身直到 std::weak_ptr 计数器同样归零时才会释放。