6

我试图了解如何使用_CrtCheckMemory来跟踪我正在处理的 Windows 应用程序中的堆损坏。我似乎无法让它返回false。这是我的测试代码:

int* test = new int[1];
for(int i = 0; i < 100; i++){
    test[i] = 1;
}
assert( _CrtCheckMemory( ) );

在上面的代码中,_CrtCheckMemory( )返回 true。我在调试模式下运行。为了获得_CrtCheckMemory标记问题的简单示例,我还需要做什么?

4

1 回答 1

7

需要一个额外的步骤,您必须说服编译器将默认的new运算符替换为调试分配器。只有调试分配器会创建“无人区”区域来检测堆块的不足或覆盖。这是有风险的,使用原始分配器编译的代码不会与没有编译的代码很好地混合。所以它迫使你明确地选择加入。

这最好在预编译的头文件(默认为stdafx.h)中完成,这样您就可以确保所有代码都使用调试分配器。像这样:

#ifdef _DEBUG
#  define _CRTDBG_MAP_ALLOC
#  define _CRTDBG_MAP_ALLOC_NEW
#  include <crtdbg.h>
#  include <assert.h>
#endif

CRTDBG 宏获得了 malloc() 函数并替换了新的运算符。

请注意,您发布的代码将首先触发另一个诊断。在 Windows Vista 及更高版本上,Windows 堆分配器首先会抱怨,因为代码破坏了 Windows 堆的完整性。通过仅索引到 2 来使覆盖更微妙。

于 2012-11-01T17:21:23.963 回答