如何修复堆错误?

时间:2012-05-18 12:16:27

标签: c++ c visual-studio-2010 visual-c++

我在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) );
}

出现此错误的原因可能是什么?

2 个答案:

答案 0 :(得分:4)

该部分是检查堆有效性的方法,它不是问题的根源。

您最有可能处理内存损坏,这可能很难调试。您最好的选择是运行内存分析器工具(例如Purify),或者,如果代码库很小,请自行查看,删除部分直到找到源代码。

当然,任何类型的未定义行为都可能导致这种情况发生。最常见的来源是:

  • 忘记从定义返回类型的函数返回
  • 多次删除对象
  • 通过指向没有virtual析构函数
  • 的基类的指针删除派生对象
  • 无效使用演员表(C风格演员,const_castreinterpret_cast
  • 访问您不拥有的内存(写入超出已分配内存的范围)
  • 等。 (随意添加

我开始时会完全重建......你永远不会知道!

答案 1 :(得分:0)

我想补充一点,如果你没有访问purify,那么valgrind也是一个很好的工具,很可能会发现这个错误。

此外,使用valgrind,您不需要再次构建项目(如purify的情况)。你可以用valgrind简单地运行你的调试可执行文件,而且valgrind也很快。