26

C++ リファレンスによると、次の方法でオブジェクトを新規作成できます。

MyClass * p1 = new MyClass;

またはによって

MyClass * p2 = new (std::nothrow) MyClass;

2 つ目は、例外をスローする代わりに null ポインターを返します。

ただし、私の経験上、このバージョンはほとんど見当たりません。

たとえば、Google はコードで例外を使用することをお勧めしませんが、私が見ることができるように、Chromium でも nothrow バージョンを使用していません。

非スローのものよりもデフォルトのものを好む理由はありますか? 例外を使用していないプロジェクトでも?

- 編集 -

フォローアップの質問: の戻り値を確認する必要がありmalloc()ますか?

それどころか、多くの人が malloc の戻り値をチェックするようにアドバイスしているようです。

多くの割り当てエラーは、メモリ不足とは関係ありません。断片化によって割り当てが失敗する可能性があります。これは、空きメモリが十分にあるにもかかわらず、使用可能な連続した領域が十分にないためです。

これは本当ですか?この場合、なぜmalloc()と をnew()異なる方法で扱うのでしょうか?

4

2 に答える 2

44

ただし、私の経験上、このバージョンはほとんど見当たりません。

失敗をローカルで処理できる場合は、それを使用します (または、同等に、既定のバージョンから例外をキャッチします)。おそらく、他のメモリを解放するように要求してから再試行するか、より小さなメモリを割り当てようとするか、余分なメモリを必要としない代替アルゴリズムを使用することによります。

非スローのものよりもデフォルトのものを好む理由はありますか?

例外の一般原則: ローカルで処理できない場合、ローカルでチェックしても意味がありません。戻り値とは異なり、例外は無視できないため、無視してヌル ポインターを使用する可能性はありません。

例外を使用していないプロジェクトでも?

多くの場合、メモリ不足の状態はまったく処理できません。その場合、おそらくプログラムを終了するのが最善の対応です。これが未処理の例外に対するデフォルトの応答です。したがって、例外を使用していない場合でもnew、ほとんどの状況ではデフォルトがおそらく最適なオプションです。

の戻り値を確認する必要がありmalloc()ますか?

はい: それが成功したかどうかを確認する唯一の方法です。そうしないと、null ポインターを使用してしまい、未定義の動作が発生する可能性があります。多くの場合、クラッシュしますが、おそらくデータの破損またはその他の奇妙な動作と、(うまくいけば)何が問題なのかを理解するための長いデバッグセッションです。

この場合、なぜmalloc()と をnew異なる方法で扱うのでしょうか?

mallocwhile を使用すると、戻り値をチェックするように強制されるためnew、邪魔にならないエラー処理のオプションが得られます。

于 2013-08-05T15:40:01.883 に答える