以下のようにコーディングすると、「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 をスローすることです。この規格では、次のnothrow
2 つのパラメーターを使用する新しいバージョンも定義しています。
void* operator new(std::size_t size, const std::nothrow_t&) throw();
NULL
このバージョンは、失敗した場合にa を返しますが、このバージョンを使用するには、追加のパラメーターを new オペレーターに明示的に渡す必要があることに注意してください。
nothrow
どのような場合にバージョンを使用する必要がありますか?
理想的には、 をスローする new の標準バージョンを常に使用する必要がありますbad_alloc
。常にその推奨事項に固執する必要があります。ただし、状況によっては、そのnothrow
バージョンの使用を余儀なくされる場合があります。そのような状況のいくつかは次のとおりです。
new
return でした。NULL
new
メモリを割り当てることができない場合、例外bad_alloc
がスローされ、この例外が処理されない場合、プログラムが異常な方法でクラッシュします。この状況を回避したい場合nothrow
は、オーバーロードされた関数の引数である which を使用するか、new
キャッチすることができます例外。nothrow
メモリが不足すると戻りnull
、プログラマはこの時点で何をすべきかを決定できます。