我试图了解如何使用_CrtCheckMemory
追踪我正在开发的 Windows 应用程序中的堆损坏。我似乎无法让它返回false
。这是我的测试代码:
int* test = new int[1];
for(int i = 0; i < 100; i++){
test[i] = 1;
}
assert( _CrtCheckMemory( ) );
在上面的代码中,_CrtCheckMemory( )
返回真。我正在调试模式下运行。为了得到一个简单的例子,我还需要做什么_CrtCheckMemory
标记问题?
需要一个额外的步骤,你必须说服编译器替换默认的new带有调试分配器的运算符。只有调试分配器会创建“无人区”区域来检测堆块的欠写或覆盖。这是有风险的,使用原始分配器编译的代码将无法与不是的代码很好地混合。因此,它迫使您明确选择加入。
最好在预编译头文件(默认情况下为 stdafx.h)中完成,这样您就可以确定all代码使用调试分配器。像这样:
#ifdef _DEBUG
# define _CRTDBG_MAP_ALLOC
# define _CRTDBG_MAP_ALLOC_NEW
# include <crtdbg.h>
# include <assert.h>
#endif
CRTDBG 宏获取 malloc() 函数和new运营商被替换。
请注意,您发布的代码将首先触发另一个诊断。在 Windows Vista 及更高版本上,Windows 堆分配器将首先抱怨,因为代码破坏了 Windows 堆完整性。通过只索引最多 2 个,使覆盖变得更微妙。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)