2010-12-20 87 views
0

我试图使用Visual Studio的功能来检测内存泄漏,但一直收到截断输出,如:_CrtDumpMemoryLeaks截断输出?

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

你期望什么呢? – sharptooth 2010-12-20 11:12:37

+0

我希望看到发生泄漏的确切文件,而不是像这样的截断输出,但类似于 Marin 2010-12-28 10:22:28

+0

我有类似的问题,并使用http://www.codeproject.com/KB/applications/visualleakdetector.aspx。对我的情况来说这是一个很好的解决方案但是,如果您在MFC初始化后启动资源并在MFC销毁后释放相同的资源,它可能会报告错误警报。 – 2011-01-17 10:01:50

回答

1

该输出未被截断。它意味着以另一种方式使用。

尝试给你的程序更深入的观察。如果您使用相同的测试步骤,则始终可以找到Visual Studio(更确切地说,大约99%的时间)会为您提供相同的泄漏地址0x0099ADB8和0x0099AD58。

现在,您需要设置断开这两个地址更改的数据断点。在程序的开始处打开,选择Debug-> New Breakpoint-> New Data Breakpoint,输入地址。在你的情况下,你需要创建其中两个:一个用于0x0099ADB8,另一个用于0x0099AD58。然后最终你会停止在实例化这块内存的代码上,这会给你正确的泄漏点。

有可能是你每次都得到不同的泄漏地址的情况。在这种情况下,您最好使用gflags和WinDBG,以便您有机会区分内存内容并从那里开始。

2

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

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

尝试查找在应用程序中存储文件名的地方。这可能会指出你实际的泄漏。

2

如果你想要源文件+行号分配的位置,那么你必须使用CRT调试分配函数,而不是普通的malloc/new。

如果你使用“新”,那么你可以这样做:#define new DEBUG_NEW

或者对malloc的,用_malloc_dbg代替的malloc。只要阅读_malloc_dbg的MSDN文档,您就会在那里看到各种项目。大多数使用这个的宏将在这里使用__FILE__和__LINE__。