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