原創作品,轉載請標明:http://blog.csdn.net/Xiejingfa/article/details/50759210
在前面一篇文章中,我們了解了C++11中引入的智能指針之一shared_ptr,今天,我們來介紹一下另一種智能指針unique_ptr。
unique_ptr介紹
unique是獨特的、唯一的意思,故名思議,unique_ptr可以“獨占”地擁有它所指向的對象,它提供一種嚴格意義上的所有權。這一點和我們前面介紹的shared_ptr類型指針有很大的不同:shared_ptr允許多個指針指向同一對象,而unique_ptr在某一時刻只能有一個指針指向該對象。unique_ptr保存指向某個對象的指針,當它本身被刪除或者離開其作用域時會自動釋放其指向對象所占用的資源。
下面,我們就來具體介紹一下unique_ptr的基本特性。
1、如何創建unique_ptr
unique_ptr不像shared_ptr一樣擁有標準庫函數make_shared來創建一個shared_ptr實例。要想創建一個unique_ptr,我們需要將一個new 操作符返回的指針傳遞給unique_ptr的構造函數。
示例:
- 1
- 2
- 3
- 4
- 5
2、無法進行復制構造和賦值操作
unique_ptr沒有copy構造函數,不支持普通的拷貝和賦值操作。
- 1
- 2
- 3
- 4
- 5
- 6
3、可以進行移動構造和移動賦值操作
unique_ptr雖然沒有支持普通的拷貝和賦值操作,但卻提供了一種移動機制來將指針的所有權從一個unique_ptr轉移給另一個unique_ptr。如果需要轉移所有權,可以使用std::move()函數。
示例:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
4、可以返回unique_ptr
unique_ptr不支持拷貝操作,但卻有一個例外:可以從函數中返回一個unique_ptr。
示例:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
unique_ptr使用場景
1、為動態申請的資源提供異常安全保證
我們先來看看下面這一段代碼:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
這是我們傳統的寫法:當我們動態申請內存后,有可能我們接下來的代碼由于拋出異常或者提前退出(if語句)而沒有執行delete操作。
解決的方法是使用unique_ptr來管理動態內存,只要unique_ptr指針創建成功,其析構函數都會被調用。確保動態資源被釋放。
- 1
- 2
- 3
- 4
- 5
- 6
2、返回函數內動態申請資源的所有權
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
3、在容器中保存指針
- 1
- 2
- 3
- 4
- 5
4、管理動態數組
標準庫提供了一個可以管理動態數組的unique_ptr版本。
- 1
- 2
- 3
- 4