嘿,我正在尝试使用以下命令检测visual studio中的漏洞:
#define _CRTDBG_MAPALLOC
#include <stdlib.h>
#include <crtdbg.h>在main的末尾,我输入:
_CrtDumpMemoryLeaks(); 当我做这一切的时候,我得到了内存泄漏(里面有什么),但没有分配的地方,你能帮我用命令显示分配的位置吗,提前谢谢。
发布于 2010-09-23 23:34:23
你不能开箱即用。CrtDumpMemoryLeaks只会告诉您是否有内存泄漏,而不是内存泄漏的位置。CRT没有提供这样的设施。
有几种方法可以完成这样的事情。一种方法是使用Valgrind这样的工具,它检测整个应用程序并在虚拟机中运行应用程序。Valgrind严重减慢了应用程序的速度,但使这种分析成为可能。CRT没有在虚拟机中运行东西的奢侈,所以它不能真正提供这样的信息。
另一种方法是使用更智能的调试器,这些调试器能够理解堆分配路径并为您跟踪每个分配,就像Aaron Klotz's documents in his answer一样。
哦,还有一件事--如果您在C++中正确使用内存,就不应该担心内存泄漏,因为您不应该手动delete内存。请考虑使用各种智能指针类型包装对new的任何调用。
发布于 2010-09-23 23:57:27
为什么不使用微软提供的免费Debugging Tools For Windows包中的UMDH实用程序呢?如果您正确设置了调试符号,它将为您提供分配的实际调用堆栈。
注意:如果使用COM和BSTR,请确保将OANOCACHE环境变量设置为1。如果不这样做,OLEAUT32.DLL将缓存BSTR分配,并且它们将在您的UMDH输出中显示为假阳性。
发布于 2012-07-14 03:28:07
您应该使用_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
https://stackoverflow.com/questions/3779912
复制相似问题