vs2008 使用Visual Leak Detector检测内存泄漏
http://hi.baidu.com/maydaygmail/item/8ea6ebef87ca9103560f1dfe
轉自:http://hi.baidu.com/sunchongjing/blog/item/cd1920faf61ee7d3b48f3108.html
?
靈活自由是C/C++語言的一大特色,而這也為C/C++程 序員出了一個難題。當程序越來越復雜時,內存的管理也會變得越加復雜,稍有不慎就會出現內存問題。內存泄漏是最常見的內存問題之一。內存泄漏如果不是很嚴 重,在短時間內對程序不會有太大的影響,這也使得內存泄漏問題有很強的隱蔽性,不容易被發現。然而不管內存泄漏多么輕微,當程序長時間運行時,其破壞力是 驚人的,從性能下降到內存耗盡,甚至會影響到其他程序的正常運行。另外內存問題的一個共同特點是,內存問題本身并不會有很明顯的現象,當有異常現象出現時 已時過境遷,其現場已非出現問題時的現場了,這給調試內存問題帶來了很大的難度。
??????
???????Visual Leak Detector是一款用于Visual C++的免費的內存泄露檢測工具。可以在http://www.codeproject.com/KB/applications/visualleakdetector.aspx下載到(使用Download Visual Leak Detector 1.0 - 476 Kb?即可)。相比較其它的內存泄露檢測工具,它在檢測到內存泄漏的同時,還具有如下特點:
1.可以得到內存泄漏點的調用堆棧,如果可以的話,還可以得到其所在文件及行號;
2.可以得到泄露內存的完整數據;
3.可以設置內存泄露報告的級別;
4.它是一個已經打包的lib,使用時無須編譯它的源代碼。而對于使用者自己的代碼,也只需要做很小的改動;
5.他的源代碼使用GNU許可發布,并有詳盡的文檔及注釋。對于想深入了解堆內存管理的讀者,是一個不錯的選擇。
??????
????可見,從使用角度來講,Visual Leak Detector簡單易用,對于使用者自己的代碼,唯一的修改是#include Visual Leak Detector的頭文件后正常運行自己的程序,就可以發現內存問題。從研究的角度來講,如果深入Visual Leak Detector源代碼,可以學習到堆內存分配與釋放的原理、內存泄漏檢測的原理及內存操作的常用技巧等。
???這里只介紹Visual Leak Detector的使用方法與步驟,Visual Leak Detector的源代碼以及Visual Leak Detector的工作原理清訪問http://www.codeproject.com/KB/applications/visualleakdetector.aspx(英文)
和http://www.cppblog.com/iniwf/archive/2009/03/22/77465.aspx(中文)。
下面來介紹如何使用這個小巧的工具。
???首先從網站上下載zip包,解壓之后得到vld.h, vldapi.h, vld.lib, vldmt.lib, vldmtdll.lib, dbghelp.dll等文件。將.h文件拷貝到Visual C++的默認include(C:\Program Files\Microsoft Visual Studio 9.0\VC\include)目錄下,將.lib文件拷貝到Visual C++的默認lib目錄下,便安裝完成了。因為版本問題,如果使用windows 2000或者以前的版本,需要將dbghelp.dll拷貝到你的程序的運行目錄下,或其他可以引用到的目錄(使用環境win7下要將dbghelp.dll拷貝到你生產exe文件debug目錄下,或者添加到system32目錄下)。一般只能在debug模式下
????接下來需要將其加入到自己的代碼中。方法很簡單,只要在包含入口函數的.cpp文件中包含vld.h就可以。如果這個cpp文件包含了stdafx.h,則將包含vld.h的語句放在stdafx.h的包含語句之后,否則放在最前面。如下是一個示例程序:
???????? #include?<vld.h>
???????? void?main()
??????? {
?????? …
???????? }
???????接下來讓我們來演示如何使用Visual Leak Detector檢測內存泄漏。下面是一個簡單的程序,用new分配了一個int大小的堆內存,并沒有釋放。其申請的內存地址用printf輸出到屏幕上。
???????? #include?<vld.h>
???????? #include?<stdlib.h>
???????? #include?<stdio.h>
???????? void?f()
???????? {
?????????????int?*p =?new?int(0x12345678);
??????????????printf("p=%08x, ", p);
????????? }
???????? void?main()
??????? {
???????????f();
???????? }
按F5即可
編譯運行后,在標準輸出窗口得到:
p=003a89c0
在Visual C++的Output窗口得到:
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 57 at 0x003A89C0: 4 bytes ----------?--57號塊0x003A89C0地址泄漏了4個字節
Call Stack:???????????????????????????????????????????????--下面是調用堆棧
????d:\test\testvldconsole\testvldconsole\main.cpp (7): f?--表示在main.cpp第7行的f()函數
????d:\test\testvldconsole\testvldconsole\main.cpp (14): main?–雙擊以引導至對應代碼處
????f:\rtm\vctools\crt_bld\self_x86\crt\src\crtexe.c (586): __tmainCRTStartup
????f:\rtm\vctools\crt_bld\self_x86\crt\src\crtexe.c (403): mainCRTStartup
????0x7C816D4F (File and line number not available): RegisterWaitForInputIdle
Data:???????????????????????????????????--這是泄漏內存的內容,0x12345678
????78 56 34 12??????????????????????????????????????????????????xV4..... ........
Visual Leak Detector detected 1 memory leak.???
第二行表示57號塊有4字節的內存泄漏,地址為0x003A89C0,根據程序控制臺的輸出,可以知道,該地址為指針p。程序的第7行,f()函數里,在該地址處分配了4字節的堆內存空間,并賦值為0x12345678,這樣在報告中,我們看到了這4字節同樣的內容。
可以看出,對于每一個內存泄漏,這個報告列出了它的泄漏點、長度、分配該內存時的調用堆棧、和泄露內存的內容(分別以16進制和文本格式列出)。雙擊該堆棧報告的某一行,會自動在代碼編輯器中跳到其所指文件的對應行。這些信息對于我們查找內存泄露將有很大的幫助。
這是一個很方便易用的工具,安裝后每次使用時,僅僅需要將它頭文件包含進來重新build就可以。而且,該工具僅在build Debug版的時候會連接到你的程序中,如果build Release版,該工具不會對你的程序產生任何性能等方面影響。所以盡可以將其頭文件一直包含在你的源代碼中。
總結
以上是生活随笔為你收集整理的vs2008 使用Visual Leak Detector检测内存泄漏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++——auto_ptr类
- 下一篇: c语言中realloc()函数解析