unique_ptr是一種定義在<memory>中的智慧型指針(smart pointer)。它持有對對象的獨有權——兩個unique_ptr不能指向一個對象,不能進行複製操作只能進行移動操作。
基本介紹
- 外文名:unique ptr
- 類型:智慧型指針
- 定義函式:<memory>
- 所屬學科:軟體
概要,功能,
概要
unique_ptr在超出作用域,即以下情況時它指向的對象會被摧毀:
- unique_ptr指向的對象被破壞
- 對象通過operator=()或reset()被指定到另一個指針)
unique_ptr還可能沒有對象,這種情況被稱為empty。
例如:
std::unique_ptr<int>p1(new int(5));
std::unique_ptr<int>p2=p1;// 編譯會出錯
std::unique_ptr<int>p3=std::move(p1);// 轉移所有權,那塊記憶體歸p3所有, p1成為無效的針.
p3.reset();//釋放記憶體.
p1.reset();//無效
功能
unique_ptr十分依賴於右值引用和移動語義。
下面是一段傳統的會產生不安全的異常的代碼:
X* f() {
X* p =new X; // 做一些事情 – 可能會拋出某個異常
return p;
}
解決方法是,用一個unique_ptr 來管理這個對象的所有權,由其進行這個對象的刪除釋放工作:
X* f() {
unique_ptr p(new X); // 或者使用{new X},但是不能 = new X
return p.release();
}
如果程式執行過程中拋出了異常,unique_ptr就會(毫無疑問地)刪除釋放它所指向的對象,這是最基本的RAII。但是,除非我們真的需要返回一個內建的指針,我們可以返回一個unique_ptr,讓事情變得更好。
unique_ptr f() {
unique_ptr p(new X); // 或者使用{new X},但是不能 = new X
return p; // 對象的所有權被傳遞出f()
}
我們可以這樣使用函式f():
void g() {
unique_ptr q = f(); // 使用移動構造函式(move constructor)
q->memfct(2); // 使用q
X x = *q; // 複製指針q所指向的對象
// …
} // 在函式退出的時候,q以及它所指向的對象都被刪除釋放
unique_ptr擁有“移動意義(move semantics)”,所以我們可以使用函式f() 返回的右值對q進行初始化,這樣就簡單地將所有權傳遞給了q。
在那些要不是為了避免不安全的異常問題(以及為了保證指針所指向的對象都被正確地刪除釋放),我們不可以使用內建指針的情況下,我們可以在容器中保存unique_ptr以代替內建指針:
在那些要不是為了避免不安全的異常問題(以及為了保證指針所指向的對象都被正確地刪除釋放),我們不可以使用內建指針的情況下,我們可以在容器中保存unique_ptr以代替內建指針:
vector<unique_ptr<string>> vs {
new string{"Doug"}, new string{"Adams"}
};
unique_ptr可以通過一個簡單的內建指針構造完成,並且與內建指針相比,兩者在使用上的差別很小。特殊情況下,unique_ptr並不提供任何形式的動態檢查(?)。.
unique_ptr在超出作用域,即以下情況時它指向的對象會被摧毀:
unique_ptr指向的對象被破壞
對象通過operator=()或reset()被指定到另一個指針)
unique_ptr還可能沒有對象,這種情況被稱為empty。
例如:
std::unique_ptr<int>p1(new int(5));
std::unique_ptr<int>p2=p1;// 編譯會出錯
std::unique_ptr<int>p3=std::move(p1);// 轉移所有權,那塊記憶體歸p3所有, p1成為無效的針.
p3.reset();//釋放記憶體.
p1.reset();//無效