我有一些正在调试的 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
将是您要删除的指针的值。