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最常见的使用场景,就是替代原始指针,为动态申请的资源提供异常安全保证。