內存泄漏定位以及解決
阿新 • • 發佈:2018-03-14
har name 沒有 cpu 運行時間 AC check 進行 超出
1 內存泄漏定位
1.1 valgrind
Valgrind包含下列工具:
- memcheck:檢查程序中的內存問題,如泄漏、越界、非法指針等。
- callgrind:檢測程序代碼的運行時間和調用過程,以及分析程序性能
- cachegrind:分析CPU的cache命中率、丟失率,用於進行代碼優化。
- helgrind:用於檢查多線程程序的競態條件
- massif:堆棧分析器,指示程序中使用了多少堆內存等信息。
通過valgrand --tool=name 程序名來分別調用的
Memcheck: 最常用的工具,用來檢測程序中出現的內存問題,所有對內存的讀寫都會被檢測到,一切對malloc、free、new、delete的調用都會被捕獲。
- 對未初始化內存的使用
- 讀/寫釋放後的內存塊
- 讀/寫超出malloc分配的內存塊
- 讀/寫不適當的棧中內存塊
- 內存泄漏,指向一塊內存的指針永遠丟失
- 不正確的malloc/free或new/delete匹配
1.2 觀察內存
隨著程序的運行內存不斷增長,根據情況判斷是否泄漏。
2 避免內存泄漏
2.1 良好的編碼習慣
使用malloc分配的內存,要調用free釋放
malloc\realloc ------ free
new \new[] ---------- delete \delete[]
2.2 使用RAII管理資源-資源獲取即初始化
本質上說就是將內存的獲取放在構造函數,將內存的釋放放在析構函數。主要是避免了忘記free或是delete。但是如果沒有在析構函數中釋放資源,那麽RAII也是沒多大用處的。
2.3 share_ptr來管理內存
類似於GC了
內存泄漏定位以及解決