std::unique_ptr
来自cppreference.com
该页由英文版wiki使用Google Translate机器翻译而来。
该翻译可能存在错误或用词不当。鼠标停留在文本上可以看到原版本。你可以帮助我们修正错误或改进翻译。参见说明请点击这里. |
在头文件 <memory> 中定义
|
||
template< class T, |
(1) | (C++11 起) |
template < class T, |
(2) | (C++11 起) |
std::unique_ptr
是一个智能指针原文:
std::unique_ptr
is a smart pointer that:- 保留了唯一的一个对象的所有权通过指针原文:retains sole ownership of an object through a pointer, and
-
unique_ptr
超出范围时,会破坏指向的对象.....原文:destroys the pointed-to object when theunique_ptr
goes out of scope.
unique_ptr
是不能拷贝或复制,转让,无法管理的两个实例unique_ptr
同一个对象。一个non-constunique_ptr
的管理对象的所有权转移到另一个unique_ptr
。一个const std::unique_ptr不得转让,限制的生命周期的管理对象指针的范围中。当unique_ptr
被销毁,它处理的对象,通过Deleter
.原文:
unique_ptr
is not copyable or copy-assignable, two instances of unique_ptr
cannot manage the same object. A non-const unique_ptr
can transfer the ownership of the managed object to another unique_ptr
. A const std::unique_ptr cannot be transferred, limiting the lifetime of the managed object to the scope in which the pointer was created. When the unique_ptr
is destroyed, it disposes of the object through Deleter
.有两个版本的
1) std::unique_ptr
原文:
There are two versions of
std::unique_ptr
:管理一个单一的对象的生命周期,例如新的分配
2) 原文:
manages the lifetime of a single object, e.g. allocated with new
管理一个阵列的寿命与运行时间的长度,例如分配新的[]
原文:
manages the lifetime of an array with a runtime length, e.g. allocated with new[]
典型用途的
std::unique_ptr
包括原文:
Typical uses of
std::unique_ptr
include- 提供异常安全的类和函数来处理动态一生的对象,通过异常正常退出和退出保障缺失对.原文:providing exception safety to classes and functions that handle objects with dynamic lifetime, by guaranteeing deletion on both normal exit and exit through exception.
- 功能通过动态一生唯一拥有的对象的所有权原文:passing ownership of uniquely-owned objects with dynamic lifetime into functions
- 收购从功能的动态一生唯一拥有的对象的所有权原文:acquiring ownership of uniquely-owned objects with dynamic lifetime from functions
- 作为移动感知的容器,如std::vector,动态分配的对象的指针,例如元素类型如果需要的多态行为原文:as the element type in move-aware containers, such as std::vector, which hold pointers to dynamically-allocated objects, e.g. if polymorphic behavior is desired
[编辑] 会员类型
会员类型
|
Definition |
pointer | std::remove_reference<D>::type::pointer如果存在该类型的,否则T *
原文: std::remove_reference<D>::type::pointer if that type exists, otherwise T* |
element_type | T ,该对象的类型的此unique_ptr 管理原文: T , the type of the object managed by this unique_ptr |
deleter_type | Deleter ,函数对象或左值引用函数或函数对象,被调用的析构函数原文: Deleter , the function object or lvalue reference to function or to function object, to be called from the destructor |
[编辑] 成员函数
构造一个新的 unique_ptr (公共成员函数) | |
解构的托管对象,如果存在 原文: destructs the managed object if such is present (公共成员函数) | |
分配 unique_ptr (公共成员函数) | |
| |
返回一个指针,指向被管理对象,并释放所有权 原文: returns a pointer to the managed object and releases the ownership (公共成员函数) | |
取代管理的对象 (公共成员函数) | |
掉期所管理的对象 (公共成员函数) | |
| |
返回一个指针,指向被管理对象 原文: returns a pointer to the managed object (公共成员函数) | |
返回删除器,用于管理对象的破坏 原文: returns the deleter that is used for destruction of the managed object (公共成员函数) | |
检查是否有相关的管理对象 原文: checks if there is associated managed object (公共成员函数) | |
原文: Single-object version, unique_ptr<T> | |
解引用指针到的管理对象 原文: dereferences pointer to the managed object (公共成员函数) | |
| |
提供索引访问管理的阵列 原文: provides indexed access to the managed array (公共成员函数) |
[编辑] 非成员函数
另一个 unique_ptr 比较或与nullptr 原文: compares to another unique_ptr or with nullptr (函数模板) | |
(C++11) |
专业的std::swap算法 原文: specializes the std::swap algorithm (函数模板) |
[编辑] Helper类
(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 owns Foo if (p1) p1->bar(); { std::unique_ptr<Foo> p2(std::move(p1)); // now p2 owns Foo f(*p2); p1 = std::move(p2); // ownership returns to p1 std::cout << "destroying p2...\n"; } if (p1) p1->bar(); // Foo instance is destroyed when p1 goes out of scope }
输出:
Foo::Foo Foo::bar f(const Foo&) destroying p2... Foo::bar Foo::~Foo