2013-01-03 19 views
19

JavaとC#の両方、そしておそらく他の多くの言語でも、nullパラメータを使用しない場合にスローされる事前定義の例外クラスがあります。 C++に似たものはありますか?そうでない場合は、私が使用できる事前定義された別の例外がありますか?NullPointerExceptionのC++に相当するものがありますか?

+9

セグメンテーションフォルト。 – kmkaplan

+0

FTR、C#では、あなたがチームメイトによって刺されることがない限り、NullReferenceExceptionsを使用しません。 –

+0

C#ではArgumentNullExceptionを使用しています。私のチームメイトはいつもよかったです。 –

答えて

20

NULLポインタの逆参照は、C++では未定義の動作です。つまり、コードが動作するように見えることを意味します。例外がスローされることは保証されません。あなたは

std::invalid_argument

例外を(それに意味のある価値を提供 - "p is NULL")を使用することができますが、あなたは自分自身をチェックしなければならないでしょう。

+0

ありがとう、これは私が探していた答えです。 –

9

通常、C++(またはその点ではC)では、はありません。はNULLポインタを逆参照します。これを行うには、未定義の動作(私が知っている実装ではsegfaultと思われますが、標準に従って何かが起こる可能性があります)。それはおそらく他の言語でも悪いことですが、私はそれを主張するのに十分なものは分かりません。

回復するよりも状況を防ぐのが最善です(これはCとかC++ではできません)。 assert()

int foo(int* myint) 
{ 
    // Ensure myint is not NULL 
    assert(myint); 

    // Do something with myint 
    (*myint)++; 

    return *myint; 
} 

このような呼び出しは完全にリリースでは無視されて構築され、これの生産にはコストを持っていない:

いくつかの関連するプログラマのエラーを防ぐために、通常のパターンは、次のような関数本体の内部でassert()を使用することです。彼らは開発を助けるだけです。デバッグビルドでは、条件が満たされない場合、プログラムはすぐに非常に明示的なエラーメッセージで異常終了します。デバッガを使用して実行すると、コールスタックを簡単にチェックして、正確な理由を調べることができます。

+5

さらにC#en Javaでは、スレッドプールなどのすべての実行時例外からの非常に高いレベルの回復)。これらは、プログラミングエラーを見つけやすくするためのものです。 – Thirler

+0

NDEBUGを定義して(-DNDEBUG)コードをコンパイルすると、assert()が#ifdefされます。 – daddesio

4

FTRの場合、チームメイトが刺し傷を取る場合を除き、C#ではNullReferenceExceptionを使用しません。ヌル引数を拒否する代わりにArgumentNullExceptionがあります。 NREは、ランタイムによってスローされるものであり、あなたがスローされるものではありません。

しかし、これらのうちの1つをキャッチしてはいけないので、アサーションよりも実際にこの利点がないことに注意してください。スローされた場合、バグを示します。これらはEric Lippertがboneheaded exceptionsと呼んでいるもので、あなた自身の間違いであり、あなたのコードが特別なことをする必要はありません。

2

C++の逆参照では、ポインタが定義されていない動作をしますが、主にセグメント化エラーでアプリケーションが終了します。 Visual Studioでは、Structured Exception Handling(SEH)のような拡張機能を使用して、NULLポインタ逆参照をキャッチすることができます。

2

C++標準では、ほとんどの場合、ヌルポインタ(誤って取り除く)を間違って使用すると、その動作は定義されません。特定の例外タイプは提供されていません(例外もスローされません)。

ただし、このルールには1つの例外があります。

std::function<void(int)> func = nullptr; 

そして、あなたはそれからで、それによって包まれた関数を呼び出すための試みを行う場合:関数をラップするために使用することができますC++ 11標準ライブラリのテンプレートで、NULLポインタを割り当てることができますstd::function、いくつかの引数argに対してfunc(arg);を実行すると、std::bad_function_call例外がスローされます。

これはもちろん、他の言語のヌルポインタの例外とは完全には等価ではありません。

5

NULLポインタを参照解除するための標準例外はC++ではありません。

必要な場合は、自分で実装することができます。 UNIXではSIGSEGVシグナルハンドラを設定し、ハンドラから例外をスローします。 Windowsでは、_set_se_translator()APIを使用して「構造化例外」ハンドラをインストールします。

関連する問題