1

以下のようにコーディングすると、「null」が返され、例外は発生しませんでした。

Char* pStr = new(std::nothrow)Char(10);

new 演算子で「nothrow」引数を使用しないのはどうですか? 「null」も返しますか?もしそうなら、なぜ「nothrow」引数の使用が推奨されるのですか?

Char* pStr = new Char(10);

御時間ありがとうございます。

4

3 に答える 3

5

newを指定しない限り、失敗すると例外がスローされます。指定nothrowした場合、失敗すると戻りnullptrます。

が使用される理由についてnothrow: 一部のシステムでは、例外がサポートされていません (またはサポートが不十分です) (これは、ゲーム コンソールで特に当てはまります)。したがって、それらをまったく使用しないことをお勧めします。これは、nothrow使用できる場合のほんの一例です。

于 2012-12-10T04:49:57.813 に答える
2

演算子nothrowで引数を使用しないのはどうですか? newそれも返しますnullか?

C++ 標準 (§18.4.1.1) では、演算子 new が次のように定義されています。

void* operator new (std::size_t size) throw (std::bad_alloc);

そのため、1 つの引数を取る new の標準的な動作はstd::bad_alloc、失敗した場合に a をスローすることです。この規格では、次のnothrow2 つのパラメーターを使用する新しいバージョンも定義しています。

void* operator new(std::size_t size, const std::nothrow_t&) throw();

NULLこのバージョンは、失敗した場合にa を返しますが、このバージョンを使用するには、追加のパラメーターを new オペレーターに明示的に渡す必要があることに注意してください。


nothrowどのような場合にバージョンを使用する必要がありますか?

理想的には、 をスローする new の標準バージョンを常に使用する必要がありますbad_alloc。常にその推奨事項に固執する必要があります。ただし、状況によっては、そのnothrowバージョンの使用を余儀なくされる場合があります。そのような状況のいくつかは次のとおりです。

  • 例外をサポートしていない古い C++ コンパイラ (言語が標準化される前にリリースされたもの) を使用しています。
  • 例外が明示的に無効化されているターゲット プラットフォーム (例: 組み込みシステム)、または正しく動作することが保証されていないプラットフォーム。
  • 1990 年代以降、この動作に依存する多くのレガシー コードを使用している場合、 の標準的な動作はnewreturn でした。NULL
于 2012-12-10T04:58:48.837 に答える
-1

newメモリを割り当てることができない場合、例外bad_allocがスローされ、この例外が処理されない場合、プログラムが異常な方法でクラッシュします。この状況を回避したい場合nothrowは、オーバーロードされた関数の引数である which を使用するか、newキャッチすることができます例外。nothrowメモリが不足すると戻りnull、プログラマはこの時点で何をすべきかを決定できます。

于 2012-12-10T05:13:13.223 に答える