智能指针--unique_ptr

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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值