欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

智能指针--unique_ptr

程序员文章站 2024-02-29 09:41:52
...

unique_ptr

1、简介

unique_ptr是一种定义在中的智能指针(smart pointer)。它持有对象的独有权——两个unique_ptr不能指向一个对象,不能进行复制操作,只能进行移动操作;
unique_ptr在超出作用域,即以下情况时它指向的对象会被摧毁:
- unique_ptr对象被释放
- 对象通过operator=()或reset()被指定到另一个指针
unique_ptr还可能没有对象,这种情况被称为empty。
例如:

std::unique_ptr<int> p1(new int(5));
std::unique_ptr<int> p2(new int(0));
p1 = std::move(p2); //p2转移所有权给p1,p1原先指向的值为5的对象被释放
p1.reset();     //p1指向的值为0的对象被释放

2、功能

(1) 自动释放内存,动态资源的异常安全保证

当程序发生异常退出导致没有运行释放内存的代码或者代码杂乱忘记释放申请的内存时,就会造成内存泄漏。
使用智能指针就能避免这些情况发生。

(2)返回函数内创建的动态资源

unique_ptr<int> foo()
{
    unique_ptr<int> ptr(new int(10));
    return ptr;
}

3、基本操作

创建

// 方式1
unique_ptr<int> ptr1(new int(5));
// 方式2
unique_ptr<int> ptr2 = unique_ptr<int>(new int);
// 查看汇编步骤,这两种写法步骤是一样的
C++11中,尽量使用std::make_unique而不直接使用new
template<typename T, typename... Ts>
std::unique_ptr<T> make_unique(Ts&&... params)
{
    return std::unique_ptr<T>(new T(std::forward<Ts>(params)...));
}

auto ptr = make_unique<int>(5);

复制:

// 报错, 无法进行复制构造操作
unique_ptr<int> ptr3(ptr1); 
// 只能用进行移动复制构造操作,ptr2将持有对象所有权转移给ptr4,并指向为NULL           
unique_ptr<int> ptr4(std::move(ptr2));  

赋值

// 报错,无法进行赋值操作
unique_ptr<int> ptr5 = ptr1;
// 只能进行移动赋值操作,ptr2将持有对象所有权转移给ptr4,并指向为NULL
unique_ptr<int> ptr6 = std::move(ptr2);

获取所持有对象的指针

int* ptr    = ptr6.get();
// 通过该方法获取对象的指针,要注意当unique_ptr中对象被释放后,再使用指针ptr就会报错。

获取对象指针,并解除对对象的持有

int* ptr    = ptr6.release();

释放所持有对象,重新持有另一对象

ptr6.reset(new int(10));

释放所持有对象

ptr6.reset();