0

Microsoft Visual C++ 2008 Express でコンパイルして実行すると、次の行でクラッシュするプログラムがあります。

comparison_vectors = new vec_element[(rbfnetparams->comparison_vector_length)+1];

エラー Unhandled exception at 0x7c93426d in myprog.exe: 0xC0000005: Access violation reading location 0x00000000 で

rbfnetparams->comparison_vector_length4に評価され(デバッガーで実行してチェックインする必要があります)、テストとして行を次のように変更すると、ここでまだクラッシュします。

comparison_vectors = new vec_element[5];

vec_elementいくつかの int、double、およびいくつかの bool を持つ構造体ですが、メソッドやコンストラクターはありません。new を malloc に置き換えると実行されますが、別の場所で別の new でクラッシュします。この行が実行されるたびにクラッシュするわけではなく、たまにしかクラッシュしませんが、毎回この行を同じ回数繰り返した後にクラッシュするようです。プログラムのこの時点でのメモリ使用量はわずか 10MB です。

同じプログラムが Solaris の gcc の下でコンパイルおよび実行されるため、これは奇妙になります。通常、Windows よりもはるかに多くのエラーが表示されます。

これをデバッグする方法について途方に暮れているので、助けていただければ幸いです。

4

1 に答える 1

1

Access violation reading location 0x00000000NULL「ポインタを逆参照した」ことを意味します。たまにこの行に到達したときのように見えるため、エラーが発生しrbfnetparamsます。NULL

なぜcomparison_vectors = new vec_element[5];クラッシュするのか説明できません。同じエラーメッセージですか?

rbfnetparams行の前にあるかどうかを確認NULLし、ヒットするかどうかを確認します (または条件付きブレークポイントを追加します)。次に、それが別の場所にあるより大きなバグの兆候であるかどうかを判断しますrbfnetparamsNULL

ポインターの逆参照NULLは未定義です。Solaris コンパイラがバグを隠す最適化を行う可能性があります。 これは標準で許可されています (その投稿から参照されているシリーズ全体をお読みください)。

于 2012-04-20T08:35:44.040 に答える