JavaとC#の両方、そしておそらく他の多くの言語でも、nullパラメータを使用しない場合にスローされる事前定義の例外クラスがあります。 C++に似たものはありますか?そうでない場合は、私が使用できる事前定義された別の例外がありますか?NullPointerExceptionのC++に相当するものがありますか?
答えて
NULLポインタの逆参照は、C++では未定義の動作です。つまり、コードが動作するように見えることを意味します。例外がスローされることは保証されません。あなたは
例外を(それに意味のある価値を提供 - "p is NULL"
)を使用することができますが、あなたは自分自身をチェックしなければならないでしょう。
ありがとう、これは私が探していた答えです。 –
通常、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()
を使用することです。彼らは開発を助けるだけです。デバッグビルドでは、条件が満たされない場合、プログラムはすぐに非常に明示的なエラーメッセージで異常終了します。デバッガを使用して実行すると、コールスタックを簡単にチェックして、正確な理由を調べることができます。
FTRの場合、チームメイトが刺し傷を取る場合を除き、C#ではNullReferenceException
を使用しません。ヌル引数を拒否する代わりにArgumentNullException
があります。 NREは、ランタイムによってスローされるものであり、あなたがスローされるものではありません。
しかし、これらのうちの1つをキャッチしてはいけないので、アサーションよりも実際にこの利点がないことに注意してください。スローされた場合、バグを示します。これらはEric Lippertがboneheaded exceptionsと呼んでいるもので、あなた自身の間違いであり、あなたのコードが特別なことをする必要はありません。
C++の逆参照では、ポインタが定義されていない動作をしますが、主にセグメント化エラーでアプリケーションが終了します。 Visual Studioでは、Structured Exception Handling(SEH)のような拡張機能を使用して、NULLポインタ逆参照をキャッチすることができます。
C++標準では、ほとんどの場合、ヌルポインタ(誤って取り除く)を間違って使用すると、その動作は定義されません。特定の例外タイプは提供されていません(例外もスローされません)。
ただし、このルールには1つの例外があります。
std::function<void(int)> func = nullptr;
そして、あなたはそれからで、それによって包まれた関数を呼び出すための試みを行う場合:関数をラップするために使用することができますC++ 11標準ライブラリのテンプレートで、NULLポインタを割り当てることができますstd::function
、いくつかの引数arg
に対してfunc(arg);
を実行すると、std::bad_function_call
例外がスローされます。
これはもちろん、他の言語のヌルポインタの例外とは完全には等価ではありません。
NULLポインタを参照解除するための標準例外はC++ではありません。
必要な場合は、自分で実装することができます。 UNIXではSIGSEGVシグナルハンドラを設定し、ハンドラから例外をスローします。 Windowsでは、_set_se_translator()APIを使用して「構造化例外」ハンドラをインストールします。
- 1. C#:JTableに相当するものはありますか?
- 2. Cでrandom_device相当のものがあります
- 3. PythonでNODE_ENVに相当するものがありますか?
- 4. Objective-CのstringWithUTF8Stringに相当するJavaがありますか?
- 5. C#の 'nameof()'ステートメントに相当するSwiftがありますか?
- 6. SwiftのfatalErrorに相当するObjective-Cがありますか?
- 7. JavaのC++からgetch()に相当するものはありますか?
- 8. Cの#includeに相当するものはOctaveにありますか?
- 9. JavaにTweenMax相当のものがありますか?
- 10. PHPのサブプロセスに相当するものはありますか?
- 11. GCCのstdcallに相当するものはありますか?
- 12. Tomcatのmod_statusに相当するものはありますか?
- 13. AjaxMinTaskのコマンドラインパラメータに相当するものはありますか?
- 14. PerlのSonarに相当するものはありますか?
- 15. タイムスタンプのLAST_INSERT_IDに相当するものはありますか?
- 16. JavaメソッドgetGlyphOutlineのC#に相当するものはありますか?
- 17. Java用ソースアウトライナーに相当するものはありますか?
- 18. Git:hgストリップに相当するものはありますか?
- 19. SQL Server:strpos()に相当するものはありますか?
- 20. gluScaleImage関数に相当するものはありますか?
- 21. SQLスクリプト - #defineに相当するものはありますか?
- 22. Javaデータ構造/ C++ STLに相当するものはありますか?
- 23. java.lang.Numberに相当するC++がありますか?
- 24. C++ std :: partial_sortに相当するC#はありますか?
- 25. C#のWindows.UI.Xaml.Application.OnActivatedイベントに相当するJavaScriptはありますか?
- 26. JavaのFile.separatorに相当するC#はありますか
- 27. Rubyの `respond_to?`に相当するC#はありますか?
- 28. libGDXには、JavaFXのPathTransitionに相当するものがありますか?
- 29. Goには、このJS式に相当するものがありますか?
- 30. OrientDBにRedisの「パイプライン」に相当するものがありますか?
セグメンテーションフォルト。 – kmkaplan
FTR、C#では、あなたがチームメイトによって刺されることがない限り、NullReferenceExceptionsを使用しません。 –
C#ではArgumentNullExceptionを使用しています。私のチームメイトはいつもよかったです。 –