Visual C++記憶體洩露檢測工具(VLD)
阿新 • • 發佈:2022-05-04
簡述
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 檢測記憶體洩露很容易,但在使用過程中,需要注意以下幾點:
- 需要在 Debug 模式下使用。如果是 Release 模式,則不會連結 VLD。
- 只能使用 VC++ 編譯器。這也是美中不足的一點,如果使用 Qt,只能先使用 VC++ 編譯器捕捉並解決記憶體洩露,再考慮使用 mingw(gcc/g++)編譯程式。