我在c ++中运行一个迭代过程,并且在第一次迭代完成之后,如我所料,我从第二次开始得到以下错误:
堆积在00000000212005D0处修改为0000000021200674过去 请求大小为94的Windows触发了一个断点 myProject.exe。
这可能是由于堆的损坏,这表明存在错误 myProject.exe或它加载的任何DLL。
这也可能是由于用户在按下F12时 myProject.exe具有焦点。
输出窗口可能包含更多诊断信息。
在显示此错误时,visual-c ++打开dbgheap.c,突出显示给出的部分:
extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(
const void * pUserData
)
{
if (!pUserData)
return FALSE;
if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE))
return FALSE;
return HeapValidate( _crtheap, 0, pHdr(pUserData) );
}
出现此错误的原因可能是什么?
答案 0 :(得分:4)
该部分是检查堆有效性的方法,它不是问题的根源。
您最有可能处理内存损坏,这可能很难调试。您最好的选择是运行内存分析器工具(例如Purify),或者,如果代码库很小,请自行查看,删除部分直到找到源代码。
当然,任何类型的未定义行为都可能导致这种情况发生。最常见的来源是:
virtual
析构函数const_cast
,reinterpret_cast
)我开始时会完全重建......你永远不会知道!
答案 1 :(得分:0)
我想补充一点,如果你没有访问purify,那么valgrind也是一个很好的工具,很可能会发现这个错误。
此外,使用valgrind,您不需要再次构建项目(如purify的情况)。你可以用valgrind简单地运行你的调试可执行文件,而且valgrind也很快。