web-dev-qa-db-ja.com

ポインタが有効かどうかを確認するにはどうすればよいですか?

私はこの質問の醜さをよく知っていますが、それが可能かどうか知りたいです:

プログラムが無効なポインター(NULL、未割り当てブロックなど)に対して読み取り/書き込みを行おうとすると、Windowsがアプリケーションをクラッシュさせ、アクセス違反例外が発生します。

問題は、このポインターがそれを使用しようとする前に例外を生成するかどうかを確認する方法はありますか、そうでなければ、この例外をキャッチする方法はありますか?

21
Hammer

生のポインタを使用する必要がある場合の最善の策は、それが有効なポインタまたはNULLであることを確認することです。次に、それがNULLに等しいかどうかを確認することで、それが有効かどうかを確認できます。

しかし、あなたの質問に答えるために、あなたは 構造化例外処理(SEH) でこれらの種類のものを捕まえることができます。

そうは言っても、 SEHは悪い考えです

10
Brian R. Bondy

この種のエラーをキャッチすることは、根本的な原因ではなく、症状に対処することです。

次のイディオムはどのプラットフォームでも機能します。

  • すべてのポインタをゼロに初期化します

  • ポインターが有効であることを保証できない場合は、ポインターを指示する前に、それが0でないことを確認してください

  • オブジェクトを削除するときは、削除後にポインタを0に設定します

  • 他の関数へのポインタを渡すときは、オブジェクトの所有権の問題に注意してください

12
laalto

関数IsBadReadPtrIsBadWritePtrがあり、望みどおりの動作をする可能性があります。それらを使用すべきでない理由を説明する 記事 もあります。

8
avakar

ポインターがNULLかどうかを確実にテストできます!

if ( ptr == NULL ) {
   // don't use it
}

これが、実行できる唯一のポータブルテストです。 WindowsはポインターをテストするためにさまざまなAPIを提供していますが、他の人が指摘したように、それらを使用すると問題が発生する可能性があります。

5
anon
4
RichieHindle

IsBadReadPtrのようなものを探していると思います。

ドキュメンテーション:

http://msdn.Microsoft.com/en-us/library/aa366713(VS.85).aspx

1
Suvesh Pratapa

Windowsについては知りませんが、* nixでは、SIGSEGVシグナルハンドラーをインストールして例外をインターセプトできます。

0
PaV