筆記 C 中的智慧型指標

2021-10-03 14:17:22 字數 1109 閱讀 5398

參考自《effective morden c++》

無法知道指向的是單個物件還是乙個陣列.

無法知道使用完之後是否需要析構,即是否擁有指向的物件.

無法知道應當如何析構(使用 delete 還是專門的函式)

無法知道單個析構還是陣列析構.

不能保證只析構一次。少了會導致記憶體洩漏,多了是ub.

無法檢查指標空懸.

足夠小、足夠快,幾乎和裸指標相同.

是乙個只移型別(不可複製),當其析構時,內部的物件也會被析構。

可以自定義刪除器,會略微增大尺寸.

自定義刪除器的型別需要加入到模板引數中

不建議用其儲存陣列,可以使用 vector, array 等.

可以方便地轉為 shared_ptr.

尺寸是裸指標的兩倍,因為內部既包含乙個資源指標,又包含乙個控制塊的指標.

引用計數是原子性的.

自定義刪除器不需要加入到模板引數.

控制塊包括:引用計數、弱計數、其他資料(自定義刪除器等)

不要用儲存好的裸指標來建立 shared_ptr,直接從 new 建立。因為會建立乙個新控制塊.

由上,從 this 建立指標也是很危險的,可以讓類 t 繼承std::enable_shared_from_this,然後使用 shared_from_this 函式建立.

這裡的設計模式叫 奇異遞迴模板模式.

不要用它儲存陣列

用於 sp 的輔助,不能直接獲取指向的資源.

expired() 判斷是否失效.

如果需要執行緒安全地判斷是否失效並且沒失效時返回乙個 shared_ptr,可以使用

用途:快取觀察是否失效,觀察者模式,避免 sp 迴圈依賴.

控制塊裡的弱計數記錄 wp 的數量,當 sp 和 wp 數量全部為0後,控制塊才會被析構。

make_unique 是 c++ 14的部分,可以自己寫乙個(暫略)

優先使用 make_shared,因為速度更快:控制塊和託管物件處在同一記憶體區域。

不適用的情況包括:自定義刪除器,直接傳遞大括號初始化。

使用 make_shared 後,如果 sp 數量已經為0,但還有 wp,那麼記憶體不會被釋放(物件已經被析構,控制塊未被析構).

C 中的智慧型指標

長久以來 c 最被人詬病的就是它的記憶體管理,寫個稍微複雜點的程式就經常會碰到記憶體洩漏問題。為了解決這個問題,c 也做了許多努力。在 c 98 標準中首先提出了智慧型指標的概念,引入了 auto ptr。但是在實踐中,auto ptr 有不少問題。因此在 c 11 標準中對原有的智慧型指標又做了進...

c 中的智慧型指標

1.智慧型指標的作用 為了防止記憶體洩露的問題 c 程式設計中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。程式設計師自己管理堆記憶體可以提高了程式的效率,但是整體來說堆記憶體的管理是麻煩的,c 11中引入了智慧型指標的概念,方便管理堆記憶體。使用普通指標,容易造成堆記憶...

C 中的智慧型指標

c 中的四個智慧型指標分別是 1.shared ptr 2.unique ptr 3.weak ptr 4.auto ptr 已經被c 11棄用 在c 11的環境中會爆警告warning auto ptr is deprecated 智慧型指標的作用是管理乙個指標。因為存在以下這種情況 申請的空間在...