C++ Smart Pointer: std::unique_ptr

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 物件。
}

參考資料:

About whitglint

一位熱愛程式設計的軟體工程師。
本篇發表於 C++, 軟體開發 並標籤為 , 。將永久鏈結加入書籤。

發表留言