C 學習(二十四)記憶體洩漏檢測

2021-09-24 15:54:19 字數 1829 閱讀 3485

檢測記憶體洩漏的關鍵是要能截獲住對分配記憶體和釋放記憶體的函式的呼叫。截獲住這兩個函式,我們就能跟蹤每一塊記憶體的生命週期,比如,每當成功的分配一塊記憶體後,就把它的指標加入乙個全域性的list中;每當釋放一塊記憶體,再把它的指標從list中刪除。這樣,當程式結束的時候,list中剩餘的指標就是指向那些沒有被釋放的記憶體。這裡只是簡單的描述了檢測記憶體洩漏的基本原理,詳細的演算法可以參見steve maguire的<>。

如果要檢測堆記憶體的洩漏,那麼需要截獲住malloc/realloc/free和new/delete就可以了(其實new/delete最終也是用malloc/free的,所以只要截獲前面一組即可)。對於其他的洩漏,可以採用類似的方法,截獲住相應的分配和釋放函式。比如,要檢測bstr的洩漏,就需要截獲sysallocstring/sysfreestring;要檢測hmenu的洩漏,就需要截獲createmenu/ destroymenu。(有的資源的分配函式有多個,釋放函式只有乙個,比如,sysallocstringlen也可以用來分配bstr,這時就需要截獲多個分配函式)。

1、android下的記憶體洩漏檢測

2、linux下的記憶體洩漏檢測

在windows平台下,檢測記憶體洩漏的工具常用的一般有三種,ms c-runtime library內建的檢測功能;外掛程式式的檢測工具,諸如,purify,boundschecker等;利用windows nt自帶的performance monitor。這三種工具各有優缺點,ms c-runtime library雖然功能上較之外掛程式式的工具要弱,但是它是免費的;performance monitor雖然無法標示出發生問題的**,但是它能檢測出隱式的記憶體洩漏的存在,這是其他兩類工具無能為力的地方。其他記憶體檢測工具:mallocdebug,purify, valgrind,kcachegrind,dmalloc,numega,boundschecker,parasoft ,insure++等等。

3、windows下的記憶體洩漏檢測 windows visual  leaks detector

官方並不支援 visual studio 2017,只支援 visual studio 2008 到 visual studio 2015。也有解決辦法:

安裝完成之後,將 vld 安裝目錄下的 include 目錄的兩個標頭檔案複製到 qt 預設的include 目錄下,vld 安裝目錄下的 lib 目錄下的對應的 lib 檔案複製到 qt 預設的 lib目錄下。 然後在 main.cpp 中

#include

就可以使用了。

4、ms c-runtime library crtdbg

main.cpp入口處有:

#if defined(_msc_ver) && defined(_debug)

_crtsetdbgflag(_crtsetdbgflag(_crtdbg_report_flag) | _crtdbg_leak_check_df);

#endif

每個cpp檔案都有以下巨集定義:

//lite_memory_check_begin

#if defined(win32) && defined(_msc_ver) && defined(_debug)

#define _crtdbg_map_alloc

#include #include #define debug_new new( _normal_block, __file__, __line__ )

#define new debug_new

#endif

//lite_memory_check_end

liteide是使用qt寫的應用程式,裡面大量應用了crtdbg記憶體洩露檢測的方法

5、windgb方法

C 記憶體洩漏檢測

include stdafx.h ifdef debug define debug new new normal block,file line 重新定義new用於記憶體洩漏檢測時輸出行號 define debug malloc s malloc dbg s,normal block,file li...

C 記憶體洩漏檢測

今天寫乙個程式突然想檢測一下是否有記憶體洩漏,於是上網查了一下,大多數都是一種方法。只是實現略有不同,記錄如下。在你想檢測的地方都必須包含 define crtdbg map alloc include include 在程式末尾加上 crtdumpmemoryleaks debug除錯後,如果有記...

記憶體洩漏檢測

一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般 最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的 reboot才會...