我有一些正在调试的 MS VC++ 6.0 代码。出于某种原因,在我试图删除一些动态分配的内存的某个时刻,它中断了,我收到一个弹出消息框,上面写着“用户断点从代码中调用等等等等”..然后反汇编窗口弹出,我看

*memory address* int      3

奇怪的是,代码中没有任何地方我正在调用这样的汇编指令(我认为 asm int 3 是 x86 的硬件中断命令?)..

什么可能导致这种情况?

编辑:答案:我的代码是“走出数组的末端”,但仅在 Visual Studio 调试标记为 0xFDFDFDFD 的位置,称为 NoMan'sLand 围栏..我认为它也称为 Off-by-一个错误.. 这个数组与我在发生错误时释放内存的点无关。这使得更难发现.. :(

最佳答案

您可能正在处理发现堆损坏的调试堆例程中的代码。

当您点击 Int 3 时,调用堆栈是什么样的?

编辑:根据您评论中的堆栈跟踪,例程 _CrtIsValidHeapPointer() 表示被释放的指针是错误的。这是来自 MSVC 的 DBGHEAP.C 源代码的代码片段:

    /*
     * If this ASSERT fails, a bad pointer has been passed in. It may be
     * totally bogus, or it may have been allocated from another heap.
     * The pointer MUST come from the 'local' heap.
     */
    _ASSERTE(_CrtIsValidHeapPointer(pUserData));
pUserData 将是您要删除的指针的值。

10-07 19:20
查看更多