std::unique_ptr

std::unique_ptr

定义于头文件  <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赋值 
(公开成员函数)[编辑]
修饰符
返回一个指向被管理对象的指针,并释放所有权 
(公开成员函数)[编辑]
替换所管理的对象 
(公开成员函数)[编辑]
交换所管理的对象 
(公开成员函数)[编辑]
观察器
get
返回指向被管理对象的指针 
(公开成员函数)[编辑]
返回删除器,用于被管理对象的析构 
(公开成员函数)[编辑]
检查是否有关联的被管理对象 
(公开成员函数)[编辑]
单个对象版本,unique_ptr<T>
对指向被管理对象的指针进行解引用 
(公开成员函数)[编辑]
数组版本,unique_ptr<T[]>
提供对所管理数组的按索引访问 
(公开成员函数)[编辑]

非成员函数

(C++14)
创建管理对象的唯一指针 
(函数模板)[编辑]
比另一个 unique_ptr 或 nullptr 进行比较 
(函数模板)[编辑]
特化 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值