2012-01-24 25 views
0

この特定のポインタにアクセスしようとすると、アプリケーションがクラッシュし、c0000005アクセス違反エラーが表示されます。C++アクセス違反のクラッシュ

このエラーをキャッチして、C#のtryブロックcatchブロックと同じように、プロセスを終了しないようにするにはどうすればよいですか。 または、私はそれを使用する前にそのメモリ領域にアクセスが拒否されているかどうかを確認する方法はありますか?

例:

MyClass** a = (MyClass**)(0x12345678); 
a[0]->b = 1; 

私はポインタのテーブルにアクセスし、クラスのメンバーの1つの値を設定しています。 これはうまくいきますが、問題は、 "0x12345678"は必ずその領域にロードされたクラスを持つとは限りません。アドレスには値がありますが、正しいメモリ領域を指しておらず、値0を保持していません。

これは私がもはやアプリケーションにロードされていないDLLですのソースを持っています。 私はアプリケーションの設定を動的に設定しようとしています。

+0

*アプリケーションの設定を動的に設定しようとしています*ランダムにメモリに書き込むのではなく、ツール - >オプション - >設定を使用しますか? –

+3

Do not do that .. –

+0

:私はユーザーに変更させるオプションではありません。これは基本的に私の古いアプリケーションの一つへのアップデートです。編集:私はランダムにメモリに書き込むのではなく、私が使用した基本クラス構造を逆にして、変更する設定を得ました。問題は、設定クラスのポインタが、私がアクセスできない領域を指すガベージ値を保持することがあります。 @セスカーネギーあなたが正しい結果を得ることをお勧めしますか? – John

答えて

2

Structured Exception Handlingを使用すると、これらの種類のエラーをトラップできます。特に、EXCEPTION_ACCESS_VIOLATIONのフィルタ。

例外を呑み込むときに何をしているのかを確認してください。ガベージ・アドレスがガード・ページを指している場合は、hereと記載された動作が表示されることがあります。

+0

あなたは紳士と学者です。そのために、私はあなたに私が提供できるすべてを提供します。レコードについては、__tryと__exceptを使用しました。 – John

+0

@ジョンありがとう、親切な先生。 –

関連する問題