1. 程式人生 > 其它 >Visual C++記憶體洩露檢測工具(VLD)

Visual C++記憶體洩露檢測工具(VLD)

簡述

C/C++ 程式越複雜,記憶體的管理顯得越重要,稍有不慎就會出現洩漏。如果記憶體洩漏不是很嚴重,在短時間內對程式不會有太大影響,這也使得記憶體洩漏問題有很強的隱蔽性,不易被發現。然而不管記憶體洩漏多麼輕微,當程式長時間執行時,其破壞力是驚人的 - 從效能下降到記憶體耗盡,甚至會影響其他程式的正常執行。

VLD

VLD(Visual Leak Detector)是一款用於 Visual C++ 的免費記憶體洩露檢測工具。相比較其它記憶體洩露檢測工具,它在檢測到記憶體洩漏的同時,還具有如下特點:

  • 可以得到記憶體洩漏點的呼叫堆疊,如果可以的話,還能得到其所在檔案及行號;
  • 可以得到洩露記憶體的完整資料;
  • 可以設定記憶體洩露報告的級別;
  • 它是一個已經打包的 lib,使用時無須編譯原始碼。對於使用者自己的程式碼,只需要做很小的改動;
  • 原始碼使用 GNU 許可釋出,並有詳盡的文件及註釋。對於想深入瞭解堆記憶體管理的讀者,是一個不錯的選擇。

可見,VLD 簡單易用。只需要做很小的改動(新增庫幷包含標頭檔案),然後正常執行自己的程式,就可以發現記憶體問題;如果深入原始碼,可以學習到堆記憶體分配與釋放的原理、記憶體洩漏檢測的原理及記憶體操作的常用技巧等。

下載、安裝

VLD 主頁:http://vld.codeplex.com/

進入主頁後,點選【download】按鈕進行下載 VLD 最新版本,或者在“DOWNLOADS”頁面查詢其它更多版本。

下載完成後,進行安裝(傻瓜式 - 下一步)。

安裝後的資料夾中主要包括:

  • bin:包含 dbghelp.dll、vld_x86.dll 檔案
  • include:包含 vld.h、vld_def.h 檔案
  • lib:包含 vld.lib 檔案

使用

Visual Studio

新建一個 Win32 控制檯應用程式,新增如下程式碼:

#include "stdafx.h"
#include "vld.h"

int _tmain(int argc, _TCHAR* argv[])
{
    char *pBuf = new char[200];

    return 0;
}

配置專案:

  • C/C++ -> 常規 -> 附加包含目錄:D:Program FilesVisual Leak Detectorinclude
  • 連結 -> 常規 -> 附加庫目錄:D:Program FilesVisual Leak DetectorlibWin32

在 Debug 模式下執行,將會輸出如下資訊:

報告列出了記憶體洩露是在第幾塊、所在的地址、洩露的位元組、呼叫的堆疊、記憶體內容。雙擊呼叫堆疊可以跳轉到所在行。

Qt

新建一個 Qt Console Application,在 .pro 檔案中新增如下內容:

# 只有在 Win32 下才可使用
win32 {
    CONFIG(debug, debug|release) {  # 需要基於 Debug 模式
        DEFINES += VLD_MODULE
        VLD_PATH = "D:/Program Files/Visual Leak Detector"
        INCLUDEPATH += $${VLD_PATH}/include
        LIBS += -L$${VLD_PATH}/lib/Win32 -lvld
    }
}

main.cpp 檔案如下所示:

#include <QCoreApplication>

// 新增 VLD 標頭檔案
#ifdef VLD_MODULE
#include "vld.h"
#endif

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    char *pBuf = new char[200];

    return a.exec();
}

編譯執行,在 Qt Creator 的應用程式輸出視窗中將會出現和 Visual Studio 中類似的記憶體洩露資訊。

使用 VLD 檢測記憶體洩露很容易,但在使用過程中,需要注意以下幾點:

  1. 需要在 Debug 模式下使用。如果是 Release 模式,則不會連結 VLD。
  2. 只能使用 VC++ 編譯器。這也是美中不足的一點,如果使用 Qt,只能先使用 VC++ 編譯器捕捉並解決記憶體洩露,再考慮使用 mingw(gcc/g++)編譯程式。

更多參考