繁体   English   中英

使用堆调试MS VC ++ 2005

[英]Using heap debugging MS VC++ 2005

我启用了堆调试功能,以尝试调试一些内存泄漏错误。 我这样做包括以下内容:

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

以及在感兴趣的函数中对_CrtDumpMemoryLeaks()的调用。

然后,我还编辑“项目属性”配置,将“调试类型'Native Only'设置为'Native Only'并添加预处理器定义'_DEBUG'和C / C ++代码生成运行时库/MDd 我发现无论将_CrtDumpMemoryLeaks()函数调用放在_CrtDumpMemoryLeaks() ,它都会按如下方式转储内存泄漏输出。

Detected memory leaks!
Dumping objects ->
{2606} normal block at 0x000000003D3A5370, 32 bytes long.
 Data: <VAR1> 54 48 45 52 4D 41 4C 5F 43 4F 4E 44 55 43 54 49 
{2605} normal block at 0x000000003D3A52E0, 32 bytes long.
 Data: <VAR2> 52 4F 43 4B 5F 48 45 41 54 5F 43 41 50 41 43 49 
{2604} normal block at 0x000000003D3A5250, 32 bytes long.
 Data: <VAR3> 45 51 55 49 4C 49 42 52 41 54 49 4F 4E 5F 52 45 
{2603} normal block at 0x000000003D3A51C0, 32 bytes long.
 Data: <VAR4> 4D 41 58 5F 57 41 54 45 52 5F 43 41 50 49 4C 4C 
{2602} normal block at 0x000000003D3A5130, 32 bytes long.
 Data: <VAR5> 4D 41 58 5F 47 41 53 5F 43 41 50 49 4C 4C 41 52 
{2601} normal block at 0x000000003D3A50A0, 32 bytes long.
 Data: <VAR6> 57 41 54 45 52 5F 43 4F 4D 50 52 45 53 53 49 42 
{2600} normal block at 0x000000003D3A5000, 48 bytes long.

这可能是什么意思? 这是否意味着如果在调用时有转储输出,那么错误/泄漏实际上是在此之前发生的? 我们可以肯定地得出结论吗? 如果没有,它似乎不是一个真正有用的工具。 任何有关如何正确使用或在解释方面的建议/帮助都将受到赞赏。 谢谢!

假设您具有以下对:

int *x = new int[5];
int *y = new int[7];

delete[] y;
_CrtDumpMemoryLeaks();
delete[] x;

无论您以后删除x转储都将x包括为未释放。 实际上,标准的MS技术需要对内存管理有很高了解的技能。 为了简化您的生活,我的推荐对象是Visual Leak Detector-易于嵌入到项目中并轻松定位错误(它是免费的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM