2012-03-13 12 views
0

ビジュアルスタジオで同時にアドレスが他の場所からアクセスされるかどうかを確認するにはどうすればよいですか?アクセス違反の読み取り場所0xfeef002A

アクセス違反の原因は何でしょうか?

+0

コールスタックウィンドウを調べてみましたか? –

+0

あなたの質問の最初の部分で何を求めているのかは本当に不明です。言い換えてみてください。またはこの問題の原因となるサンプルコードを投稿しますか? – JaredPar

+0

エラーは、割り当てられたメモリに対応していない仮想メモリアドレスを読み込んでいるためです。コードを見ることなく、もっと多くのことを言うことは不可能です。おそらく、以前に割り当てを解除されたメモリを読み込もうとしている可能性があります。 –

答えて

2

これは、Visual Studioランタイムデバッグヒープで使用されるspecial valuesの1つに非常に近いように見えます。 Cランタイムはメモリの割り当てと割り当て解除後に使用される多数の値があり、メモリ破損エラーをより簡単に診断できます。メモリが解放された後に値0xFEEEFEEEが使用されます。

私は何をあなたのコードで何が起こってすることができることは、オブジェクトが割り当て解除されたことである疑いがあるが、あなたはまだそれへのポインタ(ダングリングポインタ)を持っていて、そのオブジェクトのメンバ変数にアクセスしようとしています。この問題を診断するには、コードの複雑さに応じていくつかのことがあります。 1つはPage Heap Verificationを有効にし、もう1つは参照解除されているクラスのデストラクタにいくつかのブレークポイントを追加して、オブジェクトがどこで破壊されているかを調べることで、参照する他のポインタをリセットできます。ポインターがぶら下がる可能性を減らすために、shared_ptr<>などのスマートポインターの使用を検討してください。

+0

は、同時に2つのスレッドが同じ場所に書き込んでいるために、違反している読み取り場所にアクセスする可能性がありますか? –

+0

おそらく、ほとんどの場合、1つのスレッドによって行われた変更が失われるため、競合状態に陥ることはあります。私は、ここで重要なことは、アドレス0xFEEExxxxが偽であることです。実際のメモリ位置ではありません。デストラクタがあなたのオブジェクトに呼び出され、メモリが解放され、デバッグヒープが内容を0xFEEEFEEEで置き換えたと思います。それで何とかあなたはそれに関連するオフセットを取得しています。 –

関連する問題