我正在尝试使用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>
到我的代码的开头。
谢谢。
答案 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,这样你就有机会分享内存内容并从那里开始。