使用堆调试 MS VC++ 2005

Posted

技术标签:

【中文标题】使用堆调试 MS VC++ 2005【英文标题】:Using heap debugging MS VC++ 2005 【发布时间】:2012-06-14 16:22:34 【问题描述】:

我启用了堆调试来尝试调试一些内存泄漏错误。我通过包括以下内容来做到这一点:

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

在感兴趣的函数中调用_CrtDumpMemoryLeaks()

然后我还编辑项目属性配置,将调试类型设置为'Native Only',并添加预处理器定义'_DEBUG' 和C/C++ 代码生成运行时库/MDd。我发现无论我把_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.

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

【问题讨论】:

【参考方案1】:

假设您有以下对:

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

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

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

【讨论】:

谢谢.. 我会试一试的。感谢您的回复! 好像只对2008/2010有效。你知道2005年有什么选择吗?没关系,它看起来确实支持 2005 .. 会试一试。

以上是关于使用堆调试 MS VC++ 2005的主要内容,如果未能解决你的问题,请参考以下文章

visual stdio2005 如何像vc++6.0一样编译和调试啊

vc2005调试应用程序时弹出"unable to start debugging"怎么办

VC中MFC从哪里开始运行,MFC怎么调试,很急呀

vc 怎么 生成 dump 文件

在VC++中启用内存泄露检测

让 VC 调试器在堆栈溢出中显示更多帧