2010-04-01 29 views
1

我使用Visual C++發現了一個非常有趣的內存泄漏檢測器。VIsual Memory Leak Detector的使用

http://www.codeproject.com/KB/applications/visualleakdetector.aspx

我嘗試一下,但不能做它的工作原理來檢測內存泄漏的代碼。

我正在使用MS Visual Studio 2008.我錯過了任何步驟?

#include "stdafx.h" 
#include "vld.h" 
#include <iostream> 

void fun() { 
    new int[1000]; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    fun(); 
    std::cout << "lead?" << std::endl; 
    getchar(); 
    return 0; 
} 

輸出,當我在調試模式下運行是:

... 
... 
'Test.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.4053_x-ww_e6967989\msvcr80.dll', Symbols loaded. 
'Test.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', Symbols loaded (source information stripped). 
'Test.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcp90d.dll', Symbols loaded. 
'Test.exe': Loaded 'C:\Program Files\Visual Leak Detector\bin\dbghelp.dll', Symbols loaded (source information stripped). 
Visual Leak Detector Version 1.9d installed. 
No memory leaks detected. 
Visual Leak Detector is now exiting. 
The program '[5468] Test.exe: Native' has exited with code 0 (0x0). 

回答

0

如果我沒記錯的話,你仍然可以獲得標準的Visual Studio的內存泄漏報告時使用VLD,而你沒有在這種情況下得到它,所以我同意AJ,分配可能是不發生。也許嘗試將數組分配給某些東西?

除了在項目中設置路徑和包含vld.h以使VLD正常工作外,您不需要執行任何操作。

1

我的猜測是,由於new int[1000]沒有分配到任何東西,編譯器優化的代碼,並刪除了內存分配部分。 (我的猜測!)

VC6清楚地表明它是內存泄漏。

Dumping objects -> 
{69} normal block at 0x00345028, 4000 bytes long. 
Data: <    > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete. 
2

我也沒有發現「泄漏」。這是完整的故事。

VS2008調試堆報告很多終止時泄漏難以追蹤(因爲實際的分配是在沒有堆棧跟蹤的MFC代碼中)。我嘗試了VLD 2.2,它完美地追蹤了4個泄漏點(儘管這些問題不像是內存「飛濺」,即分配「單件」對象)。

修復這些VLD現在報告「沒有檢測到內存泄漏」但VS2008調試堆報告「檢測到內存泄漏!」然後傾倒出數百個。幾乎所有這些都發生在vctools \ vc7libs \ ship \ atlmfc \ src \ mfc \ strcore.cpp(141)。

看來VLD沒有檢測到所有泄漏。

使用:安裝了Feature Pack的VLD 2.2,VS2008,MFC 9。

順便說一句,上面的示例中的分配優化的建議是錯誤的,因爲在調試版本中沒有優化。