檢查C++中的記憶體洩漏-通過工具來檢查
Visual Leak Detector(VLD)是一款用於Visual C++的免費的記憶體洩露檢測工具,使用者可從下載,該軟體以庫形式與使用者的被測工程一起使用,由於VLD是按LGPL(GNU LESSER GENERAL PUBLIC LICENSE)協議對外開源,所以使用VLD是安全的,不必擔心版權問題。
使用VLD
先從網站下載VLD的zip包,當前最高版本是V1.0,解壓後得到vld.h、vldapi.h、vld.lib、vldmt.lib、vldmtdll.lib、dbghelp.dll等檔案,把這些所有.h標頭檔案拷貝到VC預設的include目錄下,將所有.lib檔案拷貝到VC
使用VLD很簡單,只須在包含入口函式的CPP或C檔案中把vld.h標頭檔案包含進來即可。該include語句要求放在最前面,如果當前工程定義預編譯head檔案(如stdafx.h),則放在“#include <stdafx.h>”語句之後就可以了。之後正常編譯、按Debug方式執行被測程式,等程式執行結束時,查閱VC的output視窗,會有“Visual Leak Detector is now exiting.”一句列印資訊,在這條件資訊之前,如果當前程式沒有記憶體洩露會有“No memory leaks detected.”資訊列印,但如果有記憶體洩露,將有類似如下資訊列印:
C:"VcTester21"sample"vc6"SampleMain.c (80): main
crt0.c (206): mainCRTStartup
0x7C816FD7 (File and line number not available): RegisterWaitForInputIdle
Data:
CD CD CD CD CD ........ ........
Visual Leak Detector detected 1 memory leak.
這個資訊指明當前發生記憶體洩露所在的函式及原始檔行號,洩露記憶體塊的地址、長度及當前記憶體值。用滑鼠雙擊指示原始碼行的提示資訊,
可以看出,VLD用起來很簡單,對它的實現原理感興趣的朋友可以閱讀VLD原始碼
從output視窗我們可以看到有記憶體洩漏:
Visual Leak Detector Version 1.0 installed (multithreaded DLL).
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 109 at 0x003ACEC8: 10 bytes ----------
Call Stack:
e:/example/memoryleak/memoryleak/memoryleak.cpp (10): wmain
f:/rtm/vctools/crt_bld/self_x86/crt/src/crtexe.c (583): __tmainCRTStartup
f:/rtm/vctools/crt_bld/self_x86/crt/src/crtexe.c (403): wmainCRTStartup
0x7C816FD7 (File and line number not available): RegisterWaitForInputIdle
Data:
CD CD CD CD CD CD CD CD CD CD ........ ........
Visual Leak Detector detected 1 memory leak.
“MemoryLeak.exe”: 已解除安裝“C:/WINDOWS/system32/dbghelp.dll”
“MemoryLeak.exe”: 已解除安裝“C:/WINDOWS/system32/version.dll”
Visual Leak Detector is now exiting.
程式“[5056] MemoryLeak.exe: 本機”已退出,返回值為 0 (0x0)。
很方便我們找出記憶體洩漏的地方!有時間一定要去研究一下這個工具的原始碼。^_^