C 11新特性之智慧型指標

2021-07-11 06:42:55 字數 2187 閱讀 8056

這一節將從用法上、記憶體儲存上以及生存週期上,對unique_ptr, shared_ptr和weak_ptr做乙個深入剖析。

unique_ptr

不共享它的指標。它無法複製到其他 unique_ptr,無法通過值傳遞到函式,也無法用於需要副本的任何標準模板庫 (stl) 演算法。只能移動 unique_ptr。這意味著,記憶體資源所有權將轉移到另一 unique_ptr,並且原始 unique_ptr 不再擁有此資源。我們建議你將物件限制為由乙個所有者所有,因為多個所有權會使程式邏輯變得複雜。因此,當需要智慧型指標用於純 c++ 物件時,可使用 unique_ptr,而當構造 unique_ptr 時,可使用 make_unique helper 函式。

引用計數的智慧型指標,用於共享物件的所有權。是c + +標準庫中乙個聰明的指標,是為多個擁有者管理記憶體中物件的生命週期而設計的。在你初始化乙個 shared_ptr 後,你可以複製它,把函式引數的值遞給它,並把它分配給其它 shared_ptr 例項。所有例項指向同乙個物件,並共享訪問乙個「控制塊」,即每當乙個新的 shared_ptr 被新增時,遞增和遞減引用計數,超出範圍,則復位。當引用計數到達零時,控制塊刪除記憶體資源和自身。

s1, s2, w1 都指向乙個 ptr_manage 的物件。

在該物件中有 shared_ref_count 與 weak_ref_count 兩個域分別記錄引用它的 shared_ptr 與 weak_ptr 的個數。這個很容易辦到,只要在複製構造與賦值函式中對相當地引用值進行加1,在析構中減1即可。ptr_manage 中的 ptr 域存放真正的物件指標位址。

當 shared_ref_cnt 被減為0時,自動釋放 ptr 指標所指向的物件。當 shared_ref_cnt 與 weak_ref_cnt 都變成0時,才釋放 ptr_manage 物件。

如此以來,只要有相關聯的 shared_ptr 存在,物件就存在。weak_ptr 不影響物件的生命週期。當用 weak_ptr 訪問物件時,物件有可能已被釋放了,要先 lock()。

物件函式原型:

template

explicit shared_ptr(t* p);

在ptr_manage物件中,比較重要的幾個成員函式包括:

shared_ptr(const shared_ptr & r); //建構函式

void reset();//可以釋放該指標,使得物件的引用計數減一;

t* get();//提供直接訪問其原始指標的方法,用於向下相容。

t& operator*() const;//提領操作

t* operator->() const;//指標操作

bool unique() const;//判斷是否為唯一擁有物件

long use_count() const;//返回引用計數值

shared_ptr& operator=(const shared_ptr& r );//賦值

weak_ptr:

weak_ptr是為了配合shared_ptr而引入的一種智慧型指標,它更像是shared_ptr的乙個助手而不是智慧型指標,因為它不具有普通指標的行為,沒有過載operator*和->,但可以使用lock獲得乙個可用的shared_ptr物件,它的最大作用在於協助shared_ptr工作,像旁觀者那樣觀測資源的使用情況.

在現代c++中,智慧型指標完全可以替代原始指標,作為新手,需要慢慢了解,過渡。

參考文獻:

1. 2.

3.

C 面試 C 11 新特性之智慧型指標

shared ptr 基本用法 shared ptr 採用引用計數的方式管理所指向的物件 當有乙個新的shared ptr指向同乙個物件時 複製shared ptr等 引用計數加1。當shared ptr離開作用域時,引用計數減1。當引用計數為0時,釋放所管理的記憶體。這樣做的好處在於解放了程式設計...

c 11 新特性 智慧型指標使用詳解

c 11新增了新的智慧型指標,unique ptr shared ptr和weak ptr,同時也將auto ptr置為廢棄 deprecated 但是在實際的使用過程中,很多人都會有這樣的問題 不知道三種智慧型指標的具體使用場景 無腦只使用shared ptr 認為應該禁用raw pointer ...

C 11之智慧型指標

c 98提供了了智慧型指標auto ptr,但c 11已將其摒棄,並提供了unique ptr和shared ptr。這三種智慧型指標模板都定義了類似指標的物件,可以將new獲得的位址賦給這種物件。當智慧型指標過期時,這些記憶體將自動被釋放。其基本用法如下 include include inclu...