在《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指標建立時開始,直到離開作...