1. 程式人生 > >檢查C++中的記憶體洩漏-通過工具來檢查

檢查C++中的記憶體洩漏-通過工具來檢查

 

Visual Leak DetectorVLD)是一款用於Visual C++的免費的記憶體洩露檢測工具,使用者可從下載,該軟體以庫形式與使用者的被測工程一起使用,由於VLD是按LGPLGNU LESSER GENERAL PUBLIC LICENSE)協議對外開源,所以使用VLD是安全的,不必擔心版權問題。

使用VLD

先從網站下載VLDzip包,當前最高版本是V1.0,解壓後得到vld.hvldapi.hvld.libvldmt.libvldmtdll.libdbghelp.dll等檔案,把這些所有.h標頭檔案拷貝到VC預設的include目錄下,將所有.lib檔案拷貝到VC

預設的lib目錄下,安裝工作就完成了。

使用VLD很簡單,只須在包含入口函式的CPPC檔案中把vld.h標頭檔案包含進來即可。該include語句要求放在最前面,如果當前工程定義預編譯head檔案(如stdafx.h),則放在“#include <stdafx.h>”語句之後就可以了。之後正常編譯、按Debug方式執行被測程式,等程式執行結束時,查閱VCoutput視窗,會有“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.

這個資訊指明當前發生記憶體洩露所在的函式及原始檔行號,洩露記憶體塊的地址、長度及當前記憶體值。用滑鼠雙擊指示原始碼行的提示資訊,

VC即自動跳轉到相應程式碼行,我們就很方便的知道是哪一行出錯了。

可以看出,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)。

很方便我們找出記憶體洩漏的地方!有時間一定要去研究一下這個工具的原始碼。^_^