今天寫乙個程式突然想檢測一下是否有記憶體洩漏,於是上網查了一下,大多數都是一種方法。只是實現略有不同,記錄如下。
在你想檢測的地方都必須包含
#define _crtdbg_map_alloc
#include
#include
在程式末尾加上_crtdumpmemoryleaks()
debug除錯後,如果有記憶體洩漏,除錯視窗會輸出記憶體洩漏的塊,如下:
#include "stdafx.h"
#define _crtdbg_map_allooc
#include
#include
int _tmain(int argc, _tchar* argv)
_crtdumpmemoryleaks();
return
0;}
除錯輸出:
會提示乙個塊號和洩漏的大小。**中加大括號的目的是說明指標的作用域,超出作用域還未釋放自然就是洩漏。所以一般全域性變數分配了記憶體,到程式結束時候才釋放,但此函式會一直把新申請的記憶體當作洩漏來對待。所以最好別再全域性分配。
在程式入口寫幾個語句,程式退出時,如果發現有記憶體洩漏,會自動在debug output視窗和debugview中輸出記憶體洩漏資訊。
int tmpflag =_crtsetdbgflag( _crtdbg_report_flag );
tmpflag |= _crtdbg_leak_check_df;
_crtsetdbgflag( tmpflag );
**如下:
#include "stdafx.h"
#define _crtdbg_map_allooc
#include
#include
int _tmain(int argc, _tchar* argv)
//_crtdumpmemoryleaks();
return
0;}
結果是一樣的,就不展示。
使用_crtmemcheckpoint(),可以查出某程式段的記憶體洩漏情況。如下:
#include "stdafx.h"
#define _crtdbg_map_allooc
#include
#include
int _tmain(int argc, _tchar* argv)
_crtmemcheckpoint(&s2);
if (_crtmemdifference(&s3, &s1, &s2)) _crtmemdumpstatistics(&s3);
//_crtdumpmemoryleaks();
return
0;}
除錯輸出:
知道了發生記憶體洩漏的塊號,可以使用_crtsetbreakalloc();函式在塊號處中斷,程式入口中加上_crtsetbreakalloc(塊號),debug後中斷的地方就是分配記憶體未釋放的地方。
通過一系列巨集定義可以直接得到記憶體洩漏的**行數。例項如下:
#include "stdafx.h"
#define _crtdbg_map_alloc
#include
#include
#ifdef _debug
#define new debug_clientblock
#endif // _debug
#ifdef _debug
#define debug_clientblock new( _client_block, __file__, __line__)
#else
#define debug_clientblock
#endif // _debug
int *p = new
int;
int _tmain(int argc, _tchar* argv)
_crtsetdbgflag(_crtdbg_alloc_mem_df | _crtdbg_leak_check_df);
return
0;}
除錯輸出:
5、c++記憶體洩漏檢測的辦法有很多,當然在vs下這可能是比較簡單的了。
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...
記憶體洩漏檢測
一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般 最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的 reboot才會...
記憶體洩漏檢測
一 記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題.記憶體洩漏往往會一種奇怪的方式來表現出來,基本上每個程式都表現出不同的方式.但是一般最後的結果只有兩個,乙個是程式當掉.乙個是系統記憶體不足.還有一種就是比較介於中間的結果程式不會當,但是系統的反映時間明顯降低,需要定時的reboot才會正常...