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(new A);
  ...
}
不需要使用delete语句。

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

std::unique_ptr 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 pl;
pl = new ClassA; //error
p1 = unique_ptr(new ClassA); //ok
赋值nullptr是可以的:
p1 = nullptr; //与调用reset()效果相同

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

你可能感兴趣的:(c++标准库)