内存泄漏检测

时间:2010-09-23 15:25:33

标签: c++ visual-studio-2010 memory-leaks

嘿,我正试图使用​​以下方法检测visual studio中的泄漏:

#define _CRTDBG_MAPALLOC
#include <stdlib.h>
#include <crtdbg.h>

在我输入的主要结尾处:

_CrtDumpMemoryLeaks(); 

当我做所有这些时,我得到了memoryleaks(内部的内容),但没有得到分配的地方,请你帮我看一下显示已分配的位置的命令,提前谢谢

3 个答案:

答案 0 :(得分:3)

为什么不使用Microsoft免费UMDH程序包附带的Debugging Tools For Windows实用程序?如果您正确设置了调试符号,它将为您提供分配的实际调用堆栈。

注意:如果您使用的是COM和BSTR,请确保将OANOCACHE环境变量设置为1。如果不这样做,OLEAUT32.DLL将缓存BSTR分配,它们将在UMDH输出中显示为误报。

答案 1 :(得分:1)

您应该使用_CRTDBG_MAP_ALLOC而不是_CRTDBG_MAPALLOC。问题是在MSDN页面上,他们有一个拼写错误,他们谈论两个标志,但只有第一个是好的。如果您希望可以检查crt / crtdbg.h,并且您将看到它仅使用_CRTDBG_MAP_ALLOC。

带有拼写错误的MSDN页面是: http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=VS.80%29.aspx

答案 2 :(得分:0)

你无法开箱即用。 CrtDumpMemoryLeaks仅告诉您是否存在任何内存泄漏,而不是内存泄漏的位置。 CRT没有提供此类设施。

有几种方法可以完成这样的事情。一种方法是使用像Valgrind这样的工具,它可以检测整个应用程序并在虚拟机中运行应用程序。 Valgrind严重降低了应用程序的速度,但这种分析成为可能。 CRT没有在虚拟机中运行的奢侈品,所以它无法真正提供这样的信息。

另一种方法是使用更智能的调试器来理解堆分配路径并跟踪每个分配,如Aaron Klotz's documents in his answer

哦,还有一件事 - 如果你在C ++中正确使用内存,你不应该担心内存泄漏,因为你不应该手动delete内存。考虑使用各种智能指针类型包装对new的任何调用。