1. 程式人生 > >內存泄漏定位以及解決

內存泄漏定位以及解決

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了

內存泄漏定位以及解決