C 記憶體洩露檢查的5個方法

2021-07-01 18:50:56 字數 1248 閱讀 1860

一、前言

在linux平台上 有valgrind可以非常方便的幫助我們定位記憶體洩漏,因為linux在開發領域的使用場景大多是跑伺服器,再加上它的開源屬性,相對而言,處理問題容 易形成「統一」的標準。而在windows平台,伺服器和客戶端開發人員慣用的除錯方法有很大不同。下面結合我的實際經驗,整理下常見定位記憶體洩漏的方 法。

二、物件計數

方法:在物件構造時計數++,析構時–,每隔一段時間列印物件的數量

優點:沒有效能開銷,幾乎不占用額外記憶體。定位結果精確。

缺點:侵入式方法,需修改現有**,而且對於第三方庫、stl容器、指令碼洩漏等因無法修改**而無法定位。

三、過載new和delete

方法:過載new/delete,記錄分配點(甚至是呼叫堆疊),定期列印。

優點:沒有看出

缺點:侵入式方法,需將標頭檔案加入到大量原始檔的頭部,以確保過載的巨集能夠覆蓋所有的new/delete。記錄分配點需要加鎖(如果你的程式是多執行緒),而且記錄分配要占用大量記憶體(也是占用的程式記憶體)。

四、hook windows系統api

方法:使用微軟的detours庫,hook分配記憶體的系統api:heapalloc/heaprealloc/heapfree(new/malloc的底層呼叫),記錄分配點,定期列印。

優點:非侵入式方法,無需修改現有檔案(hook api後,分配和釋放走到自己的鉤子函式中),檢查全面,對第三方庫、指令碼庫等等都能統計到。

缺點:記錄記憶體需要占用大量記憶體,而且多執行緒環境需要加鎖。

五、使用diagleak檢測

微軟出品的記憶體洩漏分析工具,原理同hookapi方式。配合ldgraph視覺化展示記憶體分配資料,更方便查詢洩漏。

1.在ide工程選項裡面配置release版本也生成除錯資訊,發布時,將pdb檔案和exe檔案一起發布。

2.程式執行後,開啟leakdiag,設定symbol path

3.定期log下目標程序的記憶體分配情況,通過ldgraph列印分配增長情況,來發現記憶體洩漏。

優點:同hookapi方法,非侵入式修改,無需做任何**改動。跟蹤全面。視覺化分析堆疊一覽無餘!

缺點:對效能有影響,hook分配加鎖,遍歷堆疊。但是不會占用目標程序的自身記憶體。

六、總結

C 記憶體洩露檢查的5個方法

一 前言 在linux平台上 有valgrind可以非常方便的幫助我們定位記憶體洩漏,因為linux在開發領域的使用場景大多是跑伺服器,再加上它的開源屬性,相對而言,處理問題容 易形成 統一 的標準。而在windows平台,伺服器和客戶端開發人員慣用的除錯方法有很大不同。下面結合我的實際經驗,整理下...

檢查C 記憶體洩露的方法

怎樣檢查你的 有沒有記憶體洩露呢?需要在前面加上這些 ifdef debug define debug clientblock new client block,file line else define debug clientblock endif define crtdbg map alloc...

c 記憶體洩露的檢查

對於c 的記憶體洩露檢測,除了我們自己手動檢查以外,還可以使用c 中的函式來幫助我們檢測,如下 include stdafx.h include include include using namespace std intmain 除錯的時候按f5,而不是ctrl f5否則你看不到任何除錯資訊。如...