失敗した場合にnew(std::no_throw)
ポインタを設定することを知っています。また、通常は失敗した場合に例外をスローするNULL
ことも知っています。new
std::bad_alloc
法線は、それがスローした場合にnew
もポインタを設定しますか?NULL
またはNULL
、catch()
ブロック内で設定する必要がありますか?
失敗した場合にnew(std::no_throw)
ポインタを設定することを知っています。また、通常は失敗した場合に例外をスローするNULL
ことも知っています。new
std::bad_alloc
法線は、それがスローした場合にnew
もポインタを設定しますか?NULL
またはNULL
、catch()
ブロック内で設定する必要がありますか?
C++ ではnew
、例外がスローされ (std::nothrow を使用しない限り)、ポインターが割り当てられないため、new
呼び出しが行われる前の状態になります。
ただし、質問で述べたように、失敗時に null を強制的に返すことについて説明しているこの記事に興味があるかもしれません。new
catch
例外がスローされると、例外が停止するまで、スタックは巻き戻されます (ローカル オブジェクトのデストラクタを実行します) 。ポインターを に自動的に設定するものは何もありません。またNULL
、デストラクタの 1 つがそうするのも例外ではありません。これは不自然な例です。
通常、ポインターを に設定する必要はありませんNULL
。実際、できないことが多いです。次のコードを使用します。
try {
std::string s("hello, world");
} catch (std::bad_alloc) {
// ???
}
これらの 12 バイトの割り当てが失敗する可能性があります。のコンストラクタから例外が返されstd::string
ます。その時点で、オブジェクトs
はもはや存在せず、s._SomeInternalName
内部のポインターも存在しませんs
。s
そのため、catch ブロックで使用しようとすると、コンパイラはエラーを報告します。ポインターがもう存在しない場合は、明らかに 0 に設定できません。