我启用了堆调试来尝试调试一些内存泄漏错误。我这样做包含以下内容:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
在感兴趣的函数中调用_CrtDumpMemoryLeaks()
。
然后我还编辑Project Property配置以将Debugging类型设置为'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.
这意味着什么?这是否意味着如果在调用点存在转储输出,那么错误/泄漏实际上是在此之前发生的?我们可以肯定地得出结论吗?如果没有,它似乎不是一个真正有用的实用程序。任何有关如何正确使用或解释如何使用的建议/帮助表示赞赏。谢谢!
答案 0 :(得分:1)
假设您有以下对:
int *x = new int[5];
int *y = new int[7];
delete[] y;
_CrtDumpMemoryLeaks();
delete[] x;
无论您删除x
以后转储都包含x
未释放。实际上标准的MS技术需要高技能的内存管理理解。为了简化您的生活,我的推荐是Visual Leak Detector - 易于嵌入到您的项目中并轻松找到错误(并且它是免费的)。