我试图了解如何使用_CrtCheckMemory
来追踪我正在处理的Windows应用程序中的堆损坏。 我似乎无法让它返回false
。 这是我的testing代码:
int* test = new int[1]; for(int i = 0; i < 100; i++){ test[i] = 1; } assert( _CrtCheckMemory( ) );
在上面的代码中, _CrtCheckMemory( )
返回true。 我在debugging模式下运行。 为了得到一个简单的_CrtCheckMemory
标记问题的例子,我还需要做些什么?
需要额外的步骤,您必须说服编译器用调试分配器替换默认的新运算符。 只有调试分配器创建检测堆块的覆盖不足或覆盖的“无人区域”区域。 这是有风险的,与原来的分配器编译的代码将不能很好地与代码混合。 所以它迫使你明确地选择加入。
最好在预编译的头文件(默认为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。