c++11中避免內存泄露的機制

1.智能指針解決內存泄漏的問題
1.1.智能指針是存儲只想動態內存分配對象的指針類,用於生存期的控制,能夠確保在離開指針所作用域時,自動正確的銷燬動態分配的對象,防止內存泄漏
通過使用引用計數實現,使用一次增1,析構一次減1
1.2.三種智能指針
a.shared_ptr共享的智能指針
使用引用計數,每一個shared_ptr拷貝都指向一個相同的內存,最後一次析構釋放
初始化
不能直接將原始指針賦值來初始化,只能通過構造函數和輔助方法來初始化
智能指針可以通過bool類型來判斷指針是否爲null
一個未初始化的智能指針可以通過reset方法初始化;當智能指針中有值的時候,用reset會使引用計數減1
獲取原始指針
int* p = ptr.get()
指定刪除器
當p引用計數爲0時,自動調用刪除器deleteIntPtr釋放內存
當管理動態數組的時候,默認刪除其不支持數組對象,需要指定
指定刪除器delete[]
用default_delete作爲刪除器
通過封裝make_shared_arry方法讓shared_ptr支持數組
注意事項
不要用一個原始指針初始化多個shared_ptr
不要在函數的實參中創建shared_ptr
不要將this指針作爲shared_ptr返回出來,要用shared_from_this()
原因enable_shared_from_this類中有一個weak_ptr,用來觀測this智能指針,調用shared_from_this()時,會調用內部這個weak_ptr的lock方法
避免循環引用
b.unique_ptr獨佔的智能指針
是一個獨佔型的智能指針
不允許其他的智能指針共享內部的指針,也不允許通過賦值給另外一個,不允許複製
可以通過函數返回、move轉移到其他unique_ptr中
unique_prt可以指向一個數組
指定刪除器的時候需要確定刪除器的類型
c.weak_ptr弱引用智能指針
是用來監視shared_ptr生命週期,不會使引用計數加1,不共享指針,不操作資源
基本用法
use_count()獲得當前觀測資源的引用計數
expired()方法判斷所觀測的資源是否已經被釋放
lock方法獲取所監視的shared_ptr
weak_ptr返回this指針
解決循環引用問題
其中一個成員變量改成weak_ptr就可以
1.3.通過智能指針管理第三方庫分配的內存
ScopeGuard與GURAD的區別
ScopeGurad是確保能夠正確的進行異常處理,沒有異常,正常出函數作用域
GURAD是爲了能在各種場景下正確釋放內存,本質上是一個智能指針
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章