1

我在 C++ 中运行一个迭代过程,在第一次迭代按预期完成后,从第二个开始出现以下错误:

00000000212005D0 处的堆块在 0000000021200674 处修改,超过 94 Windows 的请求大小已触发 myProject.exe 中的断点。

这可能是由于堆损坏,这表明 myProject.exe 或其已加载的任何 DLL 中存在错误。

这也可能是由于用户在 myProject.exe 获得焦点时按 F12。

输出窗口可能有更多诊断信息。

在显示此错误时,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) );
}

这个错误的原因可能是什么?

4

2 回答 2

4

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

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

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

  • 忘记从定义返回类型的函数返回
  • 多次删除对象
  • 通过指向没有virtual析构函数的基类的指针删除派生对象
  • 强制转换的无效使用(C 风格的强制转换const_cast,, reinterpret_cast
  • 访问您不拥有的内存(写入超出分配内存的范围)
  • 等(随时在此处添加

不过,我会从全面重建开始……你永远不知道!

于 2012-05-18T12:18:14.307 回答
0

我想补充一点,如果您无法访问 purify,那么 valgrind 也是一个很好的工具,并且很可能会捕获此错误。

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

于 2012-05-18T12:39:59.837 回答