unique_ptr是一個獨享所有權的智能指標,它提供了一種嚴格語義上的所有權,包括: 1、擁有它所指向的對象。 2、無法進行複製構造,也無法進行複製賦值操作。也就是說,我們無法得到指向同一個對象的兩個unique_ptr。但是可以進行移動構造和移動賦值操作。 3、儲存指向某個對象的指標,當它本身被刪除釋放的時候(比如,離開了某個範圍),會使用給定的刪除器釋放它指向的對象。 使用unique_ptr,可以實現以下功能,包括: 1、為動態申請的記憶體提供異常安全。 2、將動態申請記憶體的所有權傳遞給某個函數。 3、從某個函數返回動態申請記憶體的所有權。 4、在容器中儲存指標。 5、所有auto_ptr應該具有的(但無法在C++ 03中實現的)功能。 下面是一段傳統的會產生不安全異常的代碼:
1 X* f()2 {3 X* p = new X;4 // 做一些事情,可能會拋出某個異常5 return p;6 } 解決方案是,使用unique_ptr來管理這個對象的所有權,由其進行這個對象的釋放工作。
1 X* f()2 {3 unique_ptr<X> p(new X);4 // 做一些事情,可能會拋出異常5 return p.release();6 } 如果程式執行過程中拋出了異常,unique_ptr就會釋放它所指向的對象。但是,除非我們真的需要返回一個內建的指標,我們還可以返回一個unique_ptr。
1 unique_ptr<X> f()2 {3 unique_ptr<X> p(new X);4 // 做一些事情,可能會拋出異常5 return p;6 } 現在,我們可以這樣使用函數f():
1 void g()2 {3 unique_ptr<X> q = f(); // 使用移動建構函式(move constructor)4 q->DoSomething(); // 使用q5 X x = *q; // 複製指標q所指向的對象6 } // 在函數退出的時候,q以及它所指向的對象都被刪除釋放 unique_ptr具有移動語意,所以我們可以使用函數f()返回的右值對q進行初始化,這樣就簡單地將所有權傳遞給了q。