_CrtDumpMemoryLeaks截断输出?

时间:2010-12-20 11:11:45

标签: visual-studio-2008 memory memory-leaks

我正在尝试使用Visual Studio的功能来检测内存泄漏,但我一直在截断输出,例如:

Dumping objects ->
{174} normal block at 0x0099ADB8, 48 bytes long.
 Data: <h:\najnovije\tru> 68 3A 5C 6E 61 6A 6E 6F 76 69 6A 65 5C 74 72 75 
{170} normal block at 0x0099AD58, 32 bytes long.
 Data: <h:\najnovije\tru> 68 3A 5C 6E 61 6A 6E 6F 76 69 6A 65 5C 74 72 75 
Object dump complete.

我做错了什么?我添加了

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

到我的代码的开头。

谢谢。

3 个答案:

答案 0 :(得分:2)

不幸的是,Microsoft Visual C ++没有告诉您泄漏的确切位置。即使它会,它可能会在您的应用程序的某些通用例程(如AllocateString)或新运算符中的某处。

在你的输出中,h:\ najnovije \ tru不是导致泄漏的源文件的[截断]名称,但它是未被释放的数据块的前16个字节。

尝试在应用程序中查找存储文件名的位置。这可能会指向您实际的泄漏。

答案 1 :(得分:2)

如果你想要源文件+分配占用平面的行号,那么你必须使用CRT调试alloc函数而不是常规的malloc / new。

如果您使用的是“新”,则可以执行此操作:#define new DEBUG_NEW

或者对于malloc,使用_malloc_dbg而不是malloc。只需阅读_malloc_dbg的MSDN文档,您就会看到各种项目。大多数使用它的宏将在这里使用__FILE__和__LINE__。

答案 2 :(得分:1)

此输出不会被截断。它意味着以另一种方式使用。

尝试对您的计划进行更深入的观察。如果你使用相同的测试步骤,你总能找到Visual Studio(更准确地说,大约99%的时间)给你相同的泄漏地址0x0099ADB8和0x0099AD58。

现在,您需要设置断开这两个地址更改的数据断点。在程序开头打破,选择Debug-&gt; New Breakpoint-&gt; New Data Breakpoint,输入地址。在您的情况下,您需要创建其中两个:一个用于0x0099ADB8,另一个用于0x0099AD58。然后最终你会停止在实例化这个内存块的代码中,这样就可以确切地说明泄漏的来源。

每次都可能出现不同的泄漏地址。在这种情况下,你最好使用gflags和WinDBG,这样你就有机会分享内存内容并从那里开始。