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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章