std::unique_ptr class template
Header: <memory>
Namespace: std
unique_ptr 是一個封裝過的指標,用來管理物件的生命週期。
特性:
- 解構時會釋放它所擁有的物件。
- 例外發生時會被解構並釋放它所擁有的物件,避免 memory leak。
- 不可複製,但可將物件所有權轉移出去。所以不會有兩個 unique_ptr 共同擁有同一個物件,避免同一個物件被釋放兩次。
- 可自訂釋放物件的方式。
- 可存放在 STL 容器。
- 可支援陣列。
用法:
- 使用 new 配置物件時把指標傳入建構子,然後它會在解構時 delete 指標釋放物件。
範例:
void f() { unique_ptr<int> p(new int); // p 擁有 int 物件。 *p = 123; // p 解構時會釋放 int 物件。 }
- 使用 move() 和 return 轉移所有權。
範例:
unique_ptr<int[]> f() { unique_ptr<int[]> p(new int[10]); // p 擁有 int 物件陣列。 p[0] = 123; unique_ptr<int[]> p2(move(p)); // p 的物件所有權轉移給 p2。 p2[0] = 456; return p2; // p2 的物件所有權轉移給 caller。 }
- get() 回傳物件指標。
- release() 釋放物件所有權並回傳物件指標,不會釋放所擁有的物件。
- reset() 管理新的物件並釋放原本擁有的物件。
範例:
void f() { unique_ptr<int> p(new int); // p 擁有 int 物件。 *p.get() = 123; unique_ptr<int> p2; p2.reset(p.release()); // p 釋放物件所有權,p2 管理 p 原本擁有的物件。 *p2 = 456; // p2 解構時會釋放 int 物件。 }
參考資料: