c++标准库笔记:智能指针(4)-- unique_ptr

unique_ptr是一种在异常发生时可帮助避免资源泄露的智能指针。

一般而言,unique_ptr可确保一个对象和其相应资源同一时间只被一个pointer拥有。
unique_ptr是其所指对象的唯一拥有着,自然而然地,当unique_ptr被销毁,其所指向的对象也就自动销毁。unique_ptr的必要条件就是,它指向的对象只有一个拥有者。

使用unique_ptr有个好处就是在函数内部有显示分配内存的内容,使用unique_ptr将更好管理。
class A
{
  ...
};
void func()
{
  A*a = new A;
  ...
  delete A;
}
普通指针必须明确的delete掉对象,而这样可能会造成一些麻烦,delete的时候可能会造成异常,这样就要加上异常处理:
void func()
{
  A* a = new A; 
  try
  {
    ...
  }
  catch(...)
  {
    delete a;
    throw;
  }
  delete a;
}
或者有时候函数内有多处return语句,这也会使得程序变的繁琐,而是用unique_ptr就不用担心这个:
void func()
{
  std::unique_ptr<A> a(new A);
  ...
}
不需要使用delete语句。

unique_ptr不提供指针运算如++等;可以通过release()获得对象并释放
unique_ptr语义是独占式拥有,但是是由程序员保证没有两个或以上unique_ptr指向同一对象
unique_ptr不允许进行赋值和复制,可以通过移动语义进行初始化:

std::unique_ptr<ClassA> up(new ClassA);
std::unique_ptr up1(up); //error
std::unique_ptr up2(std::move(up); //ok
std::unique_ptr up3;
up3 = up; //error
up3 = std::move(up); //ok
如果上述的up3原本拥有对象,会有个delete的动作被调用,删除该对象
如果想指派新值给unique_ptr,新值也必须是unique_ptr:
unique_ptr<ClassA> pl;
pl = new ClassA; //error
p1 = unique_ptr<ClassA>(new ClassA); //ok
赋值nullptr是可以的:
p1 = nullptr; //与调用reset()效果相同

unique_ptr处理array
c++标准库为unique_ptr提供了一个偏特化版本来处理array,这个版本会在遗失其所指对象的拥有权时,对该对象调用delete[]。
unique_ptr<string[]> up(new string[10]); //ok
注意这个偏特化版本不提供操作符*和->,要访问数组元素需要使用[]:
*up; //error
up[0]; //ok

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值