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() の問題であることがわかりました。実際、私はここを読みました:

malloc サブシステム関数から返されるアドレスがすべてのデータ型に対して適切に配置されることを保証するために、バケット サイズ係数は、32 ビット実装では 8 の倍数、64 ビット実装では 16 の倍数でなければなりません。

IBM.com :

そこで、問題点の malloc() のサイズを変更しました。私はから行きました:

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

に:

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

そして今、それは機能します!

どうもありがとう!

于 2012-04-19T12:20:32.623 に答える
0

通常、この種のエラーは、割り当てていないメモリにアクセスしようとしたときに発生します。すべての割り当て(および解放)、特にポインターからポインター、および動的に割り当てられたメモリーにアクセスできるコードを確認してください。あなたの場合、poinersのサイズは32ビットの64ビットインデッドであり、それが主な原因であるはずです。

于 2012-04-16T10:41:04.643 に答える