天天看点

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