2012-04-16 33 views
7

私はいつも私のソフトウェアC++ & Java(Visual Studio 2008 & Eclipseでビルド)で作業していました。それを32ビットシステムから64ビットシステムに移動することができます。Ms Visual StudioのC++エラー:「Windowsがjavaw.exeでブレークポイントを起動しました」

コンパイルフェーズは大丈夫ですが、実行時に、私はというエラーを取得:

を「Windowsがjavaw.exeのにブレークポイントをトリガした。これは、原因を示しているヒープの 破損、であってよいです。 javaw.exeのバグ、または がロードしたDLLの これは、javaw.exeにフォーカスがある間にF12キーを押したことが原因である可能性があります。 出力ウィンドウにはさらに多くの診断情報が含まれている可能性があります [BREAK] [CONTINUE ] [IGNORE] "

あなたはここでエラーのスナップショットを見ることができます

enter image description here

はあなたにこのエラーが何を意味するかのいずれかのアイデアをお持ちですか? 「ヒープの破損」とはどういう意味ですか? これまでにこのようなエラーの経験がありましたか?

ありがとうございました!

+0

この例外は、単にN個のデータスロット(任意の種類のもの)を割り当て、実際にはM> N個のスロットを使用することによっても発生する可能性があります。すべてがコンパイルされますが、実行されるとエラーが発生します。 Avner – user2715960

答えて

5

これは残念なことに通常、メモリの破損を意味します。いくつかの未定義の振る舞いを返すが、他のタイプのものを返すべきでない関数。

これを解決するには、メモリ解析ツールを使用するのがよいでしょう。

+1

彼はApplication Verifierで自分の運を試すこともできます –

0

通常、割り当てられていないメモリにアクセスしようとすると、この種のエラーが発生します。すべての割り当て(および解放)、特にポインタへのポインタ、および動的に割り当てられたメモリにアクセスできるコードを調べてください。あなたのケースでは、poinersのサイズは32bitの64bitのインテルであり、それはプライムの原因になるはずです。

+1

自分が所有していないメモリにアクセスすると、アクセス違反例外が発生してランタイムが破損すると思います。 –

+0

プロセスは、ヒープの未割り当て部分としてメモリを非常によく所有している可能性があります。 –

12

これはWindowsヒープアロケータの非常に優れた機能です。これはVista以降で利用可能です。これはあなたのコードにポインタのバグがあることを伝えます。まあ、うまくいけば、それはあなたのコードであり、バグを持っているJVMではありません:)それはあなたのコードだと思うほうがいいでしょう。

実際の原因は、既に解放されたメモリ、または別のヒープから割り当てられたメモリ(他のプログラムと相互運用するときには珍しくない)を解放しようとするような、ヒープ割り当てバッファをあふれさせる。

診断は、何が間違っているかを正確に示すのに十分なほど細かいものではなく、間違ったことがあります。通常、慎重なコードレビューを行い、エラーが消えるまでコードのチャンクを人為的に無効にして追跡します。これは明示的なメモリ管理の喜びです。 32ビット版がきれい(チェックする)の場合、ポインタサイズに関する仮定のため64ビットコードと関連付けることができます。 64ビットのポインタはintまたはlongに収まらないため、切り詰められます。そして、切り捨てられたポインタ値を使用することは、このアサートを引き起こすでしょう。それは問題の幸せな種類です、あなたはコールスタックウィンドウでトラブルコードを見つけるでしょう。

4

私はそれを得ました! みなさんのおかげで、私はそれがメモリの問題だった理解、そしておそらくmalloc関数の()実際に は、私がhereをお読みください。

バケットサイジング要因は、32ビットのための8の倍数でなければなりません実装および は、mockocサブシステム関数から返されたアドレス がすべてのデータ型に対して正しく整列されることを保証するために、64ビットの実装では16の倍数です。

IBM.com

だから、私は、問題のポイントでのmalloc()サイズを変更しました。

(int型**)はmalloc(定数*はsizeof(int型))

(int型**)はmalloc(のconst *のはsizeof(int64_tの私から行ってきました))

これで機能します。

Thanx a lot!

+7

いずれの構造も正しくありません。 mallocを呼び出す一般的な形式は '(T *)malloc(count * sizeof(T))'です。特定の場合、正しい形式は '(int **)malloc(count * sizeof(int *))'です。 –

関連する問題