1. 程式人生 > 其它 >C++ 11智慧指標-unique_ptr

C++ 11智慧指標-unique_ptr

技術標籤:C++

一、前言
c++的記憶體管理是讓很多人頭疼的事,當我們寫一個new語句時,一般就會立即把delete語句直接也寫了,但是我們不能避免程式還未執行到delete時就跳轉了或者在函式中沒有執行到最後的delete語句就返回了,如果我們不在每一個可能跳轉或者返回的語句前釋放資源,就會造成記憶體洩露。使用智慧指標可以很大程度上的避免這個問題,因為智慧指標就是一個類,當超出了類的作用域是,類會自動呼叫解構函式,解構函式會自動釋放資源
二、應用
unique_ptr 由 C++11 引入,旨在替代不安全的 auto_ptr。unique_ptr 是一種定義在標頭檔案中的智慧指標。它持有對物件的獨有權——兩個unique_ptr 不能指向一個物件,即 unique_ptr 不共享它所管理的物件。它無法複製到其他 unique_ptr,無法通過值傳遞到函式,也無法用於需要副本的任何標準模板庫 (STL)演算法。只能移動 unique_ptr,即對資源管理許可權可以實現轉移。這意味著,記憶體資源所有權可以轉移到另一個 unique_ptr,並且原始 unique_ptr 不再擁有此資源。實際使用中,建議將物件限制為由一個所有者所有,因為多個所有權會使程式邏輯變得複雜。因此,當需要智慧指標用於存 C++ 物件時,可使用 unique_ptr,構造 unique_ptr 時,可使用 make_unique Helper 函式。

下圖演示了兩個 unique_ptr 例項之間的所有權轉換。
在這裡插入圖片描述
unique_ptr 與原始指標一樣有效,並可用於 STL 容器。將 unique_ptr 例項新增到 STL 容器執行效率很高,因為通過 unique_ptr 的移動建構函式,不再需要進行復制操作。unique_ptr 指標與其所指物件的關係:在智慧指標生命週期內,可以改變智慧指標所指物件,如建立智慧指標時通過建構函式指定、通過 reset 方法重新指定、通過 release 方法釋放所有權、通過移動語義轉移所有權,unique_ptr 還可能沒有物件,這種情況被稱為 empty。
unique_ptr的基本操作有:

//智慧指標的建立
unique_ptr<int> u_i; //建立空智慧指標 u_i.reset(new int(3)); //繫結動態物件 unique_ptr<int> u_i2(new int(4));//建立時指定動態物件 unique_ptr<T,D> u(d); //建立空 unique_ptr,執行型別為 T 的物件,用型別為 D 的物件 d 來替代預設的刪除器 delete //所有權的變化 int *p_i = u_i2.release(); //釋放所有權 unique_ptr<string> u_s(new string("abc"
)); unique_ptr<string> u_s2 = std::move(u_s); //所有權轉移(通過移動語義),u_s所有權轉移後,變成“空指標” u_s2.reset(u_s.release()); //所有權轉移 u_s2=nullptr;//顯式銷燬所指物件,同時智慧指標變為空指標。與u_s2.reset()等價