std::unique_ptr
定义于头文件
<memory>
| ||
template< class T, | (1) | (C++11 起) |
template < class T, | (2) | (C++11 起) |
std::unique_ptr
是具有以下特性的智能指针:
- 通过指针保留了唯一的对象的所有权,并且
unique_ptr
离开作用域时,会析构指向的对象。
unique_ptr
不能复制或者复制赋值,两个unique_ptr
实例不能管理同一个对象。一个非const的unique_ptr
可以将所管理对象的所有权转移到另一个unique_ptr
。一个const std::unique_ptr不能转让,而是将所管理对象的生命周期限制在指针所创建的作用域之中。当unique_ptr
销毁时,会通过Deleter
销毁所管理的对象
有两个版本的std::unique_ptr
1) 管理单一的对象的生命周期,例如使用 new 来分配
2) 管理一个数组的生命周期与运行时间长度,例如使用 new[] 分配
std::unique_ptr
的典型用途包括
- 提供异常安全的类和函数来处理具有动态生命周期的对象,通过确保正常和异常情况下退出时的删除操作。
- 通过函数传递独有的动态生命周期对象的所有权
- 从函数获得独有的动态生命周期对象的所有权
- 作为移动感知的容器,类似于std::vector持有动态分配的对象的指针,例如如果需要多态行为
成员类型
成员类型 | 定义 |
pointer | std::remove_reference<D>::type::pointer如果存在该类型的,否则T * |
element_type | T ,该对象的类型的此unique_ptr 管理 |
deleter_type | Deleter ,函数对象或左值引用函数或函数对象,被调用的析构函数 |
成员函数
构造新的unique_ptr (公开成员函数) | |
析构所管理的对象,如果存在的话 (公开成员函数) | |
为unique_ptr 赋值 (公开成员函数) | |
修饰符 | |
返回一个指向被管理对象的指针,并释放所有权 (公开成员函数) | |
替换所管理的对象 (公开成员函数) | |
交换所管理的对象 (公开成员函数) | |
观察器 | |
返回指向被管理对象的指针 (公开成员函数) | |
返回删除器,用于被管理对象的析构 (公开成员函数) | |
检查是否有关联的被管理对象 (公开成员函数) | |
单个对象版本,unique_ptr<T> | |
对指向被管理对象的指针进行解引用 (公开成员函数) | |
数组版本,unique_ptr<T[]> | |
提供对所管理数组的按索引访问 (公开成员函数) |
非成员函数
(C++14)
| 创建管理对象的唯一指针 (函数模板) |
比另一个 unique_ptr 或 nullptr 进行比较 (函数模板) | |
(C++11)
| 特化 std::swap 算法 (函数模板) |
辅助类
(C++11)
| 支持std::unique_ptr的哈希函数 (类模板特化) |
示例
#include <iostream> #include <memory> struct Foo { Foo() { std::cout << "Foo::Foo\n"; } ~Foo() { std::cout << "Foo::~Foo\n"; } void bar() { std::cout << "Foo::bar\n"; } }; void f(const Foo &foo) { std::cout << "f(const Foo&)\n"; } int main() { std::unique_ptr<Foo> p1(new Foo); // p1 拥有 Foo if (p1) p1->bar(); { std::unique_ptr<Foo> p2(std::move(p1)); // 现在 p2 拥有 Foo f(*p2); p1 = std::move(p2); // 所有权还给了 p1 std::cout << "destroying p2...\n"; } if (p1) p1->bar(); // p1 离开作用域时, Foo 实例会自动销毁 }
输出:
Foo::Foo Foo::bar f(const Foo&) destroying p2... Foo::bar Foo::~Foo