28

通常、C++ で new のテストを目にすることはありませんが、その理由を知りたいと思っていました。

Foo *f = new Foo;

// f is assumed as allocated, why usually, nobody test the return of new?

4

6 に答える 6

50

現在の標準に従って、newは決してNULLを返さず、代わりに std::bad_alloc をスローします。(古い標準に従って) new をスローするのではなく、NULL を返す場合は、" (std::nothrow) " を後置して呼び出す必要があります。すなわち

Foo* foo = new (std::nothrow) Foo;

もちろん、非常に古いツールチェーンや壊れている可能性のあるツールチェーンを使用している場合は、標準に準拠していない可能性があります。

于 2008-10-27T08:03:34.653 に答える
7

MFC 以外のアプリケーションで new 演算子が失敗した場合、バージョン 6 までの VC++ は NULL を返します。

たとえば、VC++ 6 で STL を使用すると、問題が大きくなります。STL は標準に従っているため、メモリを取得する必要があるときに NULL をテストすることはなく、メモリ不足の状態で何が起こるかを推測します....

したがって、まだ VC++ 6 と STL を使用しているすべての人は、この記事で修正を確認してください。 メモリ割り当ての失敗によってレガシー STL アプリケーションがクラッシュしないようにする

于 2008-10-27T10:37:03.457 に答える
5
  1. newデフォルトでスローstd::bad_allocします。デフォルトを使用する場合、null のチェックは廃止されますが、例外の処理が必要です。このデフォルトの動作は、C++ の例外安全パラダイムと一致しています。通常、オブジェクトが構築されるか、割り当てられないことを示します。

  2. を使用してデフォルトをオーバーライドする場合new (std::nothrow)は、null のチェックが必要です。「新規」ではページの割り当てとコミットの両方が行われるため、ページ記述子が不足したか、使用可能な物理メモリがないために、メモリが不足する可能性があります。

  3. OSのメモリ管理を調べてください。C/C++ リファレンス マシンは、OS がメモリを管理する方法を認識していないため、言語だけに頼るのは安全ではありません。メモリ割り当てがうまくいかなかった例については、C malloc()+ Linux のオーバーコミットを参照してください。

于 2008-10-27T11:23:12.660 に答える
4

それはすべて、コードが対象とする C++ のバージョンによって異なります。長い間、c++ の仕様では、少なくともデフォルトでは、new で失敗すると c++ 例外が発生するため、テストを実行するコードは完全に冗長になると述べられてきました。現在、ほとんどのプログラミングは仮想メモリ オペレーティング システムを対象としており、メモリ不足になることはほとんどありません。また、メモリ不足の状態は非常に致命的であるため、次の NULL アクセスでアプリケーションをクラッシュさせるだけでも、終了しています。

例外処理がオーバーヘッドが大きすぎると見なされ、メモリが非常に限られている組み込みプログラミングでのみ、プログラマーは新しい障害をチェックする必要があります。

于 2008-10-27T08:05:42.263 に答える
3

ここに引用されているように

「ISO C++ 標準に準拠するコンパイラでは、割り当てに十分なメモリがない場合、コードは std::bad_alloc 型の例外をスローします。エラーが try-catch ブロックまたはプログラムは異常終了します。プログラムはポインターの値をチェックする必要はありません。例外がスローされなければ、割り当ては成功しました。」

于 2008-10-27T08:06:12.887 に答える
0

通常、Visual Studio は標準の方法でスローするようになったため、新しいコードでの new の戻りをテストする人は誰もいません。

古いコードでは、スローを回避するためにハックが行われている場合でも、テストすることをお勧めします。

于 2008-10-27T08:03:55.997 に答える