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_ptrs的的链接 原文: destructs the owned object if no more shared_ptrs 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 计数器同样归零时才会释放。