使用VIsual内存泄漏检测器

时间:2010-04-01 08:21:02

标签: visual-studio-2008 memory-leaks

我使用Visual C ++找到了一个非常有趣的内存泄漏检测器。

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).

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

我也没有发现“泄漏”。这是完整的故事。

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。

BTW上面的建议是示例中的分配被优化掉了,因为在调试版本中没有进行优化。

答案 2 :(得分:0)

如果我没记错的话,你在使用VLD时仍然会得到标准的Visual Studio内存泄漏报告,而在这种情况下你没有得到它,所以我同意aj,分配可能没有发生。也许尝试将数组分配给某些东西?

除了在项目中设置路径和包含vld.h以使VLD工作之外,您不需要做任何其他事情。