System.AccessViolationException クラス

この記事は、この API のリファレンス ドキュメントの補足説明です。

アンマネージド コードまたはアンセーフ コードで、割り当てられていないメモリ、またはアクセス権を持っていないメモリに対して、読み取りまたは書き込みを行おうとすると、アクセス違反が発生します。 これは、通常、ポインターの値が正しくないために発生します。 無効なポインターによる読み取りまたは書き込みがすべてアクセス違反になるとは限らないため、通常、アクセス違反は、無効なポインターによって複数の読み取りまたは書き込みが発生したこと、およびメモリが破損している可能性があることを示します。 したがって、アクセス違反は、ほとんどの場合、重大なプログラミング エラーを示します。 AccessViolationException は、これらの重大なエラーを明確に示します。

検証可能なマネージド コードだけで構成されるプログラムでは、すべての参照は有効または null であり、アクセス違反は起こり得ません。 検証可能なコード内で null 参照を参照しようとするすべての操作では、NullReferenceException 例外がスローされます。 AccessViolationException は、検証可能なマネージド コードがアンマネージ コードまたは安全でないマネージド コードとやり取りしたときにのみ発生します。

AccessViolationException 例外のトラブルシューティング

AccessViolationException 例外が発生する可能性があるのは、安全でないマネージド コード内、または検証可能なマネージド コードがアンマネージド コードとやり取りしたときのみです。

  • 安全でないマネージド コードで発生したアクセス違反は、プラットフォームに応じて、NullReferenceException 例外または AccessViolationException 例外として表される可能性があります。
  • マネージド コードに伝えられるアンマネージド コード内でのアクセス違反は、常に、AccessViolationException 例外にラップされています。

いずれの場合も、次のようにすると、AccessViolationException 例外の原因を特定して修正できます。

  • アクセスしようとしているメモリが割り当てられていることを確認します。 保護されたメモリにアクセスしようと、つまり割り当てられていないメモリまたはプロセスによって所有されていないメモリ—にアクセスしようとすると、AccessViolationException 例外が常にスローされます。

    自動メモリ管理は、.NET ランタイムが提供するサービスの 1 つです。 アンマネージド コードと同じ機能がマネージド コードで提供されている場合、マネージド コードに移行してこの機能を利用できます。 詳細については、「 Automatic Memory Management」を参照してください。

  • アクセスしようとしているメモリが破損していないことを確認します。 無効なポインターを使って読み取りまたは書き込み操作が複数回行われると、メモリが破損する場合があります。 これは、通常、定義済みのバッファーの外部にあるアドレスの読み取りまたは書き込みが行われると発生します。

AccessViolationException と try/catch ブロック

ランタイムによって予約されたメモリの外部で例外が発生した場合、.NET ランタイムからスローされた AccessViolationException 例外は、構造化例外ハンドラーの catch ステートメントでは処理されません。 このような AccessViolationException 例外を処理するには、例外がスローされるメソッドに HandleProcessCorruptedStateExceptionsAttribute 属性を適用します。 ユーザー コードによってスローされる AccessViolationException 例外はこの変更による影響を受けず、catch ステートメントで引き続きキャッチできます。