C 11 unique ptr智慧型指標詳解

2022-06-19 01:48:16 字數 2921 閱讀 5852

在《c++11 shared_ptr智慧型指標》的基礎上,本節繼續講解 c++11 標準提供的另一種智慧型指標,即 unique_ptr 智慧型指標。

作為智慧型指標的一種,unique_ptr 指標自然也具備「在適當時機自動釋放堆記憶體空間」的能力。和 shared_ptr

指標最大的不同之處在於,unique_ptr 指標指向的堆記憶體無法同其它 unique_ptr 共享,也就是說,每個 unique_ptr

指標都獨自擁有對其所指堆記憶體空間的所有權。

這也就意味著,每個 unique_ptr 指標指向的堆記憶體空間的引用計數,都只能為 1,一旦該 unique_ptr 指標放棄對所指堆記憶體空間的所有權,則該空間會被立即釋放**。

unique_ptr 智慧型指標是以模板類的形式提供的,unique_ptr(t 為指標所指資料的型別)定義在標頭檔案,並位於 std 命名空間中。因此,要想使用 unique_ptr 型別指標,程式中應首先包含如下 2 條語句:

#include

using namespace std;

第 2 句並不是必須的,可以不新增,則後續在使用 unique_ptr 指標時,必須標註std::

考慮到不同實際場景的需要,unique_ptr模板類提供了多個實用的建構函式,這裡給讀者列舉了幾種常用的構造 unique_ptr 智慧型指標的方式。

1) 通過以下  2 種方式,可以建立出空的 unique_ptr 指標:

std::unique_ptrp1();

std::unique_ptrp2(nullptr);

2) 建立 unique_ptr 指標的同時,也可以明確其指向。例如:

std::unique_ptrp3(new int);

由此就建立出了乙個 p3 智慧型指標,其指向的是可容納 1 個整數的堆儲存空間。

和可以用 make_shared() 模板函式初始化 shared_ptr 指標不同,c++11 標準中並沒有為 unique_ptr 型別指標新增類似的模板函式。

3) 基於 unique_ptr 型別指標不共享各自擁有的堆記憶體,因此 c++11 標準中的 unique_ptr 模板類沒有提供拷貝建構函式,只提供了移動建構函式。例如:

std::unique_ptrp4(new int);

std::unique_ptrp5(p4);//錯誤,堆記憶體不共享

std::unique_ptrp5(std::move(p4));//正確,呼叫移動建構函式

值得一提的是,對於呼叫移動建構函式的 p4 和 p5 來說,p5 將獲取 p4 所指堆空間的所有權,而 p4 將變成空指標(nullptr)。

4) 預設情況下,unique_ptr 指標採用 std::default_delete方法釋放堆記憶體。當然,我們也可以自定義符合實際場景的釋放規則。值得一提的是,和 shared_ptr 指標不同,為 unique_ptr

自定義釋放規則,只能採用函式物件的方式。例如:

//自定義的釋放規則

structmydel

};std::unique_ptrp6(new int);

//std::unique_ptrp6(new int, mydel());

為了方便使用者使用 unique_ptr 智慧型指標,unique_ptr模板類還提供有一些實用的成員方法,它們各自的功能如表 1 所示。

表 1 unique_ptr指標可呼叫的成員函式

成員函式名

功 能operator*()

獲取當前 unique_ptr 指標指向的資料。

operator->()

過載 -> 號,當智慧型指標指向的資料型別為自定義的結構體時,通過 -> 運算子可以獲取其內部的指定成員。

operator =()

過載了 = 賦值號,從而可以將 nullptr 或者乙個右值 unique_ptr 指標直接賦值給當前同型別的 unique_ptr 指標。

operator ()

過載了 運算子,當 unique_ptr 指標指向乙個陣列時,可以直接通過 獲取指定下標位置處的資料。

get()

獲取當前 unique_ptr 指標內部包含的普通指標。

get_deleter()

獲取當前 unique_ptr 指標釋放堆記憶體空間所用的規則。

operator bool()

unique_ptr 指標可直接作為 if 語句的判斷條件,以判斷該指標是否為空,如果為空,則為 false;反之為 true。

release()

釋放當前 unique_ptr 指針對所指堆記憶體的所有權,但該儲存空間並不會被銷毀。

reset(p)

其中 p 表示乙個普通指標,如果 p 為 nullptr,則當前 unique_ptr 也變成空指標;反之,則該函式會釋放當前 unique_ptr 指標指向的堆記憶體(如果有),然後獲取 p 所指堆記憶體的所有權(p 為 nullptr)。

swap(x)

交換當前 unique_ptr 指標和同型別的 x 指標。

除此之外,c++11標準還支援同型別的 unique_ptr 指標之間,以及 unique_ptr 和 nullptr 之間,做 ==,!=,<,<=,>,>= 運算。

#include

#include

using namespace std;

int main()

else

std::unique_ptrp6;

//p6 獲取 p 的所有權

p6.reset(p);

cout << *p6 << endl;;

return 0;

}程式執行結果為:

10p5 is nullptr

10

C 11智慧型指標之unique ptr

unique ptr是乙個獨享所有權的智慧型指標,它提供了一種嚴格語義上的所有權,包括 1 擁有它所指向的物件。2 無法進行複製構造,也無法進行複製賦值操作。也就是說,我們無法得到指向同乙個物件的兩個unique ptr。但是可以進行移動構造和移動賦值操作。3 儲存指向某個物件的指標,當它本身被刪除...

C 11智慧型指標之unique ptr

智慧型指標是基於raii機制實現的類 模板 具有指標的行為 過載了operator 與operator 操作符 可以 智慧型 地銷毀其所指物件。c 11中有unique ptr shared ptr與weak ptr等智慧型指標,可以對動態資源進行管理 unique ptr 唯一 擁有其所指物件,同...

C 11智慧型指標之unique ptr

針對記憶體洩露的問題,先提下c語言中該怎麼辦?有幾點建議 1 乙個unique ptr持有所指物件的獨有權,即同一時刻只能有乙個unique ptr指向同乙個物件。當這個unique ptr被銷毀時,指向的物件也跟著被銷毀。2 擁有指標本身的生命週期 從unique ptr指標建立時開始,直到離開作...