unique_ptr是独享被管理对象指针所有权(owership)的智能指针。

unique_ptr对象封装一个原始指针,并负责其生命周期。

当该对象被销毁时,会在其析构函数中删除关联的原始指针。

在任何给定的时刻,只能有一个指针管理内存

当指针超出作用域时,内存自动释放

该类型指针不可copy,只可以move


三种创建方式

1.通过已有裸指针创建

2.通过new创建

3.通过std::make_unique创建(推荐)


unique_ptr可以通过get()获取地址

unique_ptr可以通过->调用成员函数

unique_ptr可以用通过*调用dereferencing


#include <iostream>

#include <string>

#include <memory>

using namespace std;

void f1() {

   unique_ptr<int> p(new int(5));

   cout<<*p<<endl;

    //unique_ptr<int> p2(p);

    //unique_ptr<int> p3 = p;

   unique_ptr<int> p2 = std::move(p);

   cout<<*p2<<endl;//5

   //cout<<*p<<endl;error,此时p指针为空

}

​上面的代码就创建了一个unique_ptr。需要注意的是,unique_ptr没有复制构造函数,不支持普通的拷贝和赋值操作。因为unique_ptr独享被管理对象指针所有权,当p2, p3失去p的所有权时会释放对应资源,此时会执行两次delete p的操作。对于p2,p3对应的行,会提示报错

unique_ptr虽然不支持普通的拷贝和赋值操作,但却可以将所有权进行转移,使用std::move方法即可。

unique最常见的使用场景,就是替代原始指针,为动态申请的资源提供异常安全保证。