1. 程式人生 > >C++11之智能指針

C++11之智能指針

周期 智能指針 文件的 指向 delet 多個 構造 循環引用 出現

1、關於智能指針的理解

  1)智能指針是使用RAII技術(資源的獲取即初始化)對普通指針進行封裝得到的,其實質是一個指針,使用起來像指針。

  2)智能指針可以用來解決程序員忘記使用delete釋放內存從而導致內存泄漏,或者多次釋放同一塊內存,以及當程序出現異常時進入catch塊中導致內存忘記釋放。

  3)智能指針還可以將值語義轉換成引用語義。

2、智能指針的使用(智能指針有三個:shared_ptr、unique_ptr、weak_ptr,放在頭文件的memory裏)

  1)由於智能指針是C++11標準下的boost庫中的,而boost庫是對STL的擴展,所以智能指針也是屬於模板類,需要指定類型,傳入的指針可以使用構造函數或者使用make_shared函數進行初始化。

  2)shared_ptr內部有一個計數器,每次使用,引用計數加一,析構的時候引用計數減一,當引用計數為0時,釋放分配的堆內存,因此shared_ptr為多個指針指向相同的對象。

  3)拷貝操作會使引用計數加一,賦值操作會使引用減一,同理當引用計數為0時,自動釋放內存,若內存釋放完後,又讓智能指針指向新的對象,那麽引用計數加一,指向新對象。

  4)get函數可以用來獲取原始指針。

  5)若一個指針同時用多個shared_ptr進行封裝,會出現多次釋放同一個內存的操作。

  6)避免循環引用,循環引用會導致堆內存無法釋放。

  7)unique_ptr智能指針同一個時刻只能有一個指針指向對象,也就是說只能有一個指針擁有對象,在出現異常的情況下,動態資源能得到釋放。其具有生命周期,從創建開始到離開作用域結束,此時釋放指向的對象,並且在作用域內可以修改其指向的對象,不允許拷貝與賦值,因為是指針同一時刻獨占這個對象,可以通過移動語義move來實現,或者reset重新進行指定,也可以使用Release來釋放其所有權。

  8)weak_ptr智能指針是用來與shared_ptr指針配合使用的,不具有普通指針的行為,沒有重載操作符*和操作符->,用來觀測shared_ptr資源,可以通過一個shared_ptr對象或者另一個weak_ptr對象構造,從而獲得資源觀測的權限。可以通過use_count函數來返回觀測的資源的引用計數,還可以通過expired()函數來判斷觀測的資源是否存在,比前者要來的快,還可以通過使用其成員函數lock()來獲得被觀測的對象,從而操作資源。當觀測的資源不存在時,返回一個存放空指針shared_ptr.

C++11之智能指針