std :: bad_allocをスローした場合、新しいポインタはNULLに設定されますか?
-
27-10-2019 - |
質問
new(std::no_throw)
を実行すると、失敗した場合にNULL
へのポインタが設定されることを私は知っています。
また、通常のnew
が失敗した場合、std::bad_alloc
例外がスローされることも知っています。
通常のnew
は、スローされた場合、NULL
へのポインターも設定しますか?または、NULL
ブロックでcatch()
に設定する必要がありますか?
解決
C ++では、不正なnew
は例外をスローし(std :: nothrowを使用しない限り)、ポインターは割り当てられないため、new
呼び出しが行われる前の状態になります。
ただし、new
にnullを返すように強制することについて説明しています。
他のヒント
例外がスローされると、catch
が例外を停止するまで、スタックが巻き戻されます(ローカルオブジェクトのデストラクタが実行されます)。ポインタをNULL
に自動的に設定するものは何もありません。また、破壊者の1人がそうするのは不思議なことです。これは、不自然な例です。
通常、ポインタをNULL
に設定する必要はありません。実際、多くの場合、それはできません。次のコードを使用してください:
ジェネラコディセタグプレ
これらの12バイトの割り当てが失敗する可能性があります。例外は、std::string
のコンストラクターから返されます。その時点で、オブジェクトs
は存在しなくなり、s._SomeInternalName
内のポインターs
も存在しなくなります。そのため、catchブロックでs
を使用しようとすると、コンパイラはエラーを報告します。また、ポインタがもう存在しない場合は、明らかに0に設定することはできません。