9

我一直在研究我的软件 C++ 和 Java(使用 Microsoft Visual Studio 2008 和 Eclipse 构建),并且一直在尝试将它从 32 位系统转移到 64 位系统。

编译阶段没问题,但在执行时我收到一条错误消息:

“Windows 已在 javaw.exe 中触发断点。这可能是由于堆损坏,这表明 javaw.exe 或其已加载的任何 DLL 中存在错误-。这也可能是由于用户在 javaw 时按 F12 .exe 有焦点。输出窗口可能有更多诊断信息。[BREAK] [CONTINUE] [IGNORE]"

您可以在此处查看错误的快照:

在此处输入图像描述

你知道这个错误是什么意思吗?“堆损坏”是什么意思?你以前有过这种错误的经验吗?

太感谢了!

4

4 回答 4

16

这是 Windows 堆分配器的一个非常好的特性,从 Vista 开始就可用。它告诉你你的代码有一个指针错误。好吧,希望是你的代码而不是 JVM 有错误 :) 你最好假设它是你的代码。

实际原因介于轻微之间,例如试图释放已经从另一个堆中释放或分配的内存(当您与另一个程序互操作时并不罕见),到非常讨厌的,例如通过溢出分配的堆而将堆炸成碎片缓冲。

诊断的粒度不够细,无法准确告诉您出了什么问题,只是出了点问题。您通常会通过仔细的代码审查和人为地禁用代码块来追踪它,直到错误消失。这就是显式内存管理的乐趣所在。如果 32 位版本是干净的(检查它),那么由于对指针大小的假设,这可能与 64 位代码相关联。64 位指针不适合 int 或 long,因此它会被截断。并且使用截断的指针值将触发此断言。这是令人高兴的问题,您会在调用堆栈窗口中找到故障代码。

于 2012-04-16T12:48:50.367 回答
5

不幸的是,这通常意味着内存损坏。一些内存的双重释放,应该返回但不返回的函数或任何其他类型的未定义行为。

解决这个问题的最好办法是使用内存分析工具,除非你知道这个损坏在哪里。

于 2012-04-16T10:38:41.183 回答
4

我知道了!谢谢大家,我知道这是内存问题,也许是 malloc() 事实上,我在这里读到:

对于 32 位实现,桶大小因子必须是 8 的倍数,对于 64 位实现,它必须是 16 的倍数,以保证从 malloc 子系统函数返回的地址对于所有数据类型都正确对齐。

IBM.com

因此,我更改了问题点中的 malloc() 大小。我来自:

(int**) malloc (const * sizeof(int))

至:

(int**) malloc (const * sizeof(int64_t))

现在它起作用了!

非常感谢!

于 2012-04-19T12:20:32.623 回答
0

通常,当您尝试访问未分配的内存时会发生这种错误。检查所有分配(和释放),尤其是指针到指针,以及可以访问动态分配内存的代码。在您的情况下,指针的大小是 64 位而不是 32 位,这应该是主要原因。

于 2012-04-16T10:41:04.643 回答