通常、C++ で new のテストを目にすることはありませんが、その理由を知りたいと思っていました。
Foo *f = new Foo;
// f is assumed as allocated, why usually, nobody test the return of new?
通常、C++ で new のテストを目にすることはありませんが、その理由を知りたいと思っていました。
Foo *f = new Foo;
// f is assumed as allocated, why usually, nobody test the return of new?
現在の標準に従って、newは決してNULLを返さず、代わりに std::bad_alloc をスローします。(古い標準に従って) new をスローするのではなく、NULL を返す場合は、" (std::nothrow) " を後置して呼び出す必要があります。すなわち
Foo* foo = new (std::nothrow) Foo;
もちろん、非常に古いツールチェーンや壊れている可能性のあるツールチェーンを使用している場合は、標準に準拠していない可能性があります。
MFC 以外のアプリケーションで new 演算子が失敗した場合、バージョン 6 までの VC++ は NULL を返します。
たとえば、VC++ 6 で STL を使用すると、問題が大きくなります。STL は標準に従っているため、メモリを取得する必要があるときに NULL をテストすることはなく、メモリ不足の状態で何が起こるかを推測します....
したがって、まだ VC++ 6 と STL を使用しているすべての人は、この記事で修正を確認してください。 メモリ割り当ての失敗によってレガシー STL アプリケーションがクラッシュしないようにする
new
デフォルトでスローstd::bad_alloc
します。デフォルトを使用する場合、null のチェックは廃止されますが、例外の処理が必要です。このデフォルトの動作は、C++ の例外安全パラダイムと一致しています。通常、オブジェクトが構築されるか、割り当てられないことを示します。
を使用してデフォルトをオーバーライドする場合new (std::nothrow)
は、null のチェックが必要です。「新規」ではページの割り当てとコミットの両方が行われるため、ページ記述子が不足したか、使用可能な物理メモリがないために、メモリが不足する可能性があります。
OSのメモリ管理を調べてください。C/C++ リファレンス マシンは、OS がメモリを管理する方法を認識していないため、言語だけに頼るのは安全ではありません。メモリ割り当てがうまくいかなかった例については、C malloc()
+ Linux のオーバーコミットを参照してください。
それはすべて、コードが対象とする C++ のバージョンによって異なります。長い間、c++ の仕様では、少なくともデフォルトでは、new で失敗すると c++ 例外が発生するため、テストを実行するコードは完全に冗長になると述べられてきました。現在、ほとんどのプログラミングは仮想メモリ オペレーティング システムを対象としており、メモリ不足になることはほとんどありません。また、メモリ不足の状態は非常に致命的であるため、次の NULL アクセスでアプリケーションをクラッシュさせるだけでも、終了しています。
例外処理がオーバーヘッドが大きすぎると見なされ、メモリが非常に限られている組み込みプログラミングでのみ、プログラマーは新しい障害をチェックする必要があります。
ここに引用されているように
「ISO C++ 標準に準拠するコンパイラでは、割り当てに十分なメモリがない場合、コードは std::bad_alloc 型の例外をスローします。エラーが try-catch ブロックまたはプログラムは異常終了します。プログラムはポインターの値をチェックする必要はありません。例外がスローされなければ、割り当ては成功しました。」
通常、Visual Studio は標準の方法でスローするようになったため、新しいコードでの new の戻りをテストする人は誰もいません。
古いコードでは、スローを回避するためにハックが行われている場合でも、テストすることをお勧めします。