以下のようにコーディングすると、「null」が返され、例外は発生しませんでした。
Char* pStr = new(std::nothrow)Char(10);
new 演算子で「nothrow」引数を使用しないのはどうですか? 「null」も返しますか?もしそうなら、なぜ「nothrow」引数の使用が推奨されるのですか?
Char* pStr = new Char(10);
御時間ありがとうございます。
以下のようにコーディングすると、「null」が返され、例外は発生しませんでした。
Char* pStr = new(std::nothrow)Char(10);
new 演算子で「nothrow」引数を使用しないのはどうですか? 「null」も返しますか?もしそうなら、なぜ「nothrow」引数の使用が推奨されるのですか?
Char* pStr = new Char(10);
御時間ありがとうございます。
newを指定しない限り、失敗すると例外がスローされます。指定nothrowした場合、失敗すると戻りnullptrます。
が使用される理由についてnothrow: 一部のシステムでは、例外がサポートされていません (またはサポートが不十分です) (これは、ゲーム コンソールで特に当てはまります)。したがって、それらをまったく使用しないことをお勧めします。これは、nothrow使用できる場合のほんの一例です。
演算子
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バージョンの使用を余儀なくされる場合があります。そのような状況のいくつかは次のとおりです。
newreturn でした。NULLnewメモリを割り当てることができない場合、例外bad_allocがスローされ、この例外が処理されない場合、プログラムが異常な方法でクラッシュします。この状況を回避したい場合nothrowは、オーバーロードされた関数の引数である which を使用するか、newキャッチすることができます例外。nothrowメモリが不足すると戻りnull、プログラマはこの時点で何をすべきかを決定できます。