の理想的な使用法はstd::nothrow
何ですか?
9 に答える
通常のnew、catchingの使用のすぐ周りにtry-catchブロックを配置する場合は、最適化(またはコードの単純化)としてのみ使用しますstd::bad_alloc
。
コールサイトでメモリ不足を有効に処理できることはめったにないため、これは非常にまれな状況です。通常、メモリを割り当てるのは、必要なためです。メモリを必要としているからではなく、メモリがなくても生活できるからです。nullポインターを渡すコードは、最終的に誰かが問題に対処できるようになるまで、呼び出し元のチェーンをバックアップします。これは慣用的なC++ではありません。
ただし、エラーは本当にすぐに処理できる場合があります。たとえば、十分な作業スペースが与えられた場合に1つのアルゴリズムまたは手法を使用し、それがない場合は別の低速のアルゴリズムまたは手法を使用する状況にある可能性があります。それではまた、そのような作業スペースを直接割り当てますnew
か?通常ではありません。とにかく、OSがオーバーコミットすると、一般にアプリケーションレベルでメモリ不足を適切に処理できないため、このアプローチには注意が必要な場合があります。
std :: nothrowを含む式でも例外をスローできることに注意してください(特に、割り当てられているオブジェクトのコンストラクターから)。したがって、例外のスローを回避したい場合に必要なのは1つだけです。また、コンストラクターがスローしないようにする必要があります。
私に関する限り、例外をまったく使用しないC++プログラムの時代は終わりました。ある特定のスタイルガイドのために彼らが私のために再開した場合、それが新しいものを必要としないもう一つの可能性のある理由だと思います。
私が理解しているように、ほとんど決してありません。
C プログラムの C++ への移植。あなたの C プログラムには、すべての malloc の後に、これらすべてのチェックがあり、例外の概念はありません。したがって、すべての malloc を try ブロックでラップするよりも、すべての malloc を new (nothrow) に変更する方がはるかに簡単です。
おそらく、アプリケーションがナノ最適化を必要とし、例外処理のオーバーヘッドを許容できない場合は、おそらくnothrow
必要になるでしょう。
Stroustrup は、プログラマーが C++ のオーバーヘッドをオフにできることにかなり固執していることに注意してください。(ただし、選択肢があるからといって、そうすべきであるとは限りません。)
新しいたびに null をチェックする必要がある場合は、std::nothrow を使用します。標準の最初のバージョンが作成されたとき、多くのレガシー コードでこれが必要でした。その後に書かれた多くのレガシーコードもそれを使用しています。時折、あなたはまだ誰かに出くわすでしょう。
あなたが実際にこれをやりたいと思うことは非常にまれなので、あなたが話していたWTFを思い出すのに1秒もかかりました.
メモリを割り当てることができなかったときにスローせず、代わりに NULL を返す古いバージョンの C++ (具体的には Microsoft) があったことを私は知っています。これは、すべてのロジックを変更するのではなく、古いコードとの互換性を維持する簡単な方法です。
http://www.cplusplus.com/reference/std/new/nothrow/
この構造はめったに使用されません。なぜなら、メモリ割り当てのパフォーマンスに実際には影響しないと思われるからです。むしろ便宜上使用できるからです。
それでも、通常は一般的なバリアントが優先されます。
これは、カスタム アロケータを使用した高速パスの最適化として使用できると想像できます。たとえば、現在のリクエストを失敗させ、後で/アイドル時間にプールを拡張します。かなりコーナーケース。
1 GiB を超えるメモリを割り当てる必要があるプログラムはごくわずかです。最新のシステムはメモリをオーバーコミットしているため、new
これらのシステムでは null を返したりスローしたりすることはありません。したがって、new/malloc の戻り値をチェックする意味はまったくありません。メモリ使用量を抑えて、メモリ不足キラーに他のプロセスを撃墜させてください!