29

Java と C# の両方、そしておそらく他の多くの言語にも、null パラメーターが使用されるべきではない場所で使用された場合にスローされる定義済みの例外クラスがあります。C++ に似たようなものはありますか? そうでない場合、使用できる定義済みの別の例外がありますか、それとも独自の例外を定義する必要がありますか?

4

7 に答える 7

27

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

std::invalid_argument

例外 (それに意味のある値を提供します - "p is NULL") ですが、自分でチェックを行う必要があります。

于 2013-01-03T12:51:30.107 に答える
9

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

状況から回復しようとするよりも、状況を防ぐのが最善です(CまたはC ++では実行できません)。

関連するプログラマーエラーを防ぐための通常のパターンは、assert()次のような関数本体の内部で使用することです。

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

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

  return *myint;
}

このようなassert()呼び出しは、リリースビルドでは完全に無視されるため、本番環境でのコストは発生しません。彼らはただ開発を助けます。デバッグビルドで、条件が満たされない場合、プログラムは非常に明示的なエラーメッセージですぐに中止されます。デバッガーを介して実行すると、呼び出しスタックを簡単にチェックして、正確な理由を調査できます。

于 2013-01-03T12:47:58.193 に答える
6

C++ には、NULL ポインターの逆参照に関する標準例外はありません。

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

于 2013-01-03T14:15:12.867 に答える
4

FTR, in C# you don't use NullReferenceExceptions for anything unless you want to get stabbed by your team mates. There is a ArgumentNullException instead for rejecting null arguments. NREs are meant to be thrown by the runtime, not you.

But note that there is no actually advantage of this over an assertion because you should not be catching one of these: if they are thrown, they indicate a bug. These are what Eric Lippert calls boneheaded exceptions and they are your own darn fault, and there is nothing your code should be doing specifically with them.

于 2013-01-03T12:50:15.847 に答える
4

ヌル ポインターの誤った使用 (特に、その参照解除) を含むほとんどすべてのケースで、C++ 標準は単純に動作を未定義のままにします。特定の例外タイプは提供されません (例外はスローされません)。

ただし、このルールの例外が 1 つ思い浮かびます。std::function関数をラップするために使用できる C++11 標準ライブラリ テンプレートである には、null ポインターを割り当てることができます。

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

func(arg);そして、 for some argumentを実行してラップされた関数を呼び出そうとすると、例外argがスローされます。std::bad_function_call

もちろん、これは他の言語の null ポインター例外と完全に同等というわけではありません。

于 2013-01-03T12:57:14.363 に答える
2

C++ では、null ポインターを逆参照すると未定義の動作が発生し、ほとんどの場合、アプリケーションはセグメンテーション違反で終了します。Visual Studio では、構造化例外処理 (SEH) などの拡張機能を使用して、null ポインターの逆参照をキャッチできます。

于 2013-01-03T12:54:02.500 に答える