std::unique_ptr

来自cppreference.com
< cpp‎ | memory
 
 
 
 
 
定义于头文件 <memory>
template<

    class T,
    class Deleter = std::default_delete<T>

> class unique_ptr;
(1) (C++11 起)
template <

    class T,
    class Deleter

> class unique_ptr<T[],Deleter>;
(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[]>
提供对所管理数组的按索引访问
(公开成员函数) [编辑]

[编辑] 非成员函数

从参数创建并返回unique_ptr,便于类型推断
原文:
{{{2}}}
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

(函数模板) [编辑]
比另一个 unique_ptrnullptr 进行比较
(函数模板) [编辑]
特化 std::swap 算法
(函数模板) [编辑]

[编辑] 辅助类

支持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