2

失敗した場合にnew(std::no_throw)ポインタを設定することを知っています。また、通常は失敗した場合に例外をスローするNULLことも知っています。newstd::bad_alloc

法線は、それがスローした場合にnewもポインタを設定しますか?NULLまたはNULLcatch()ブロック内で設定する必要がありますか?

4

2 に答える 2

6

C++ ではnew、例外がスローされ (std::nothrow を使用しない限り)、ポインターが割り当てられないため、new呼び出しが行われる前の状態になります。

ただし、質問で述べたように、失敗時に null を強制的に返すことについて説明しているこの記事に興味があるかもしれません。new

于 2011-01-30T20:12:55.773 に答える
0

catch例外がスローされると、例外が停止するまで、スタックは巻き戻されます (ローカル オブジェクトのデストラクタを実行します) 。ポインターを に自動的に設定するものは何もありません。またNULL、デストラクタの 1 つがそうするのも例外ではありません。これは不自然な例です。

通常、ポインターを に設定する必要はありませんNULL。実際、できないことが多いです。次のコードを使用します。

try { 
  std::string s("hello, world");
} catch (std::bad_alloc) {
 // ???
}

これらの 12 バイトの割り当てが失敗する可能性があります。のコンストラクタから例外が返されstd::stringます。その時点で、オブジェクトsはもはや存在せず、s._SomeInternalName内部のポインターも存在しませんssそのため、catch ブロックで使用しようとすると、コンパイラはエラーを報告します。ポインターがもう存在しない場合は、明らかに 0 に設定できません。

于 2011-01-31T14:29:45.423 に答える