1. 程式人生 > >C++11新特性之智慧指標

C++11新特性之智慧指標

  這一節將從用法上、記憶體儲存上以及生存週期上,對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 函式。
unique_ptr

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

shared_ptr<string> s1(new string);
shared_ptr<string> s2 = s1;
weak_ptr<string
> w1 = s2;

記憶體空間

  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 物件。
  只剩下weak_ptr情形


  如此以來,只要有相關聯的 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++中,智慧指標完全可以替代原始指標,作為新手,需要慢慢了解,過渡。