オペレーター (PODのnew
場合は malloc/calloc) は、大量のメモリ チャンクを割り当てるときに、シンプルで効率的な形式の失敗をサポートします。
これがあるとしましょう:
const size_t sz = GetPotentiallyLargeBufferSize(); // 1M - 1000M
T* p = new (nothrow) T[sz];
if(!p) {
return sorry_not_enough_mem_would_you_like_to_try_again;
}
...
std::containers にそのような構造はありますか、それとも友達と (予想される!!) 例外を常に処理する必要がstd::vector
ありますか?
メモリを事前に割り当てるカスタム アロケータを作成し、このカスタム アロケータをベクトルに渡す方法があるのではないでしょうか。そのため、事前にアロケータに入れるよりも多くのメモリをベクトルが要求しない限り、失敗しません。 ?
後付け: 本当に必要なのはbool std::vector::reserve(std::nothrow) {...}
、通常の予約関数に加えてメンバー関数です。しかし、アロケーターが拡張されて nothrow 割り当てが可能になった場合にのみ意味があるため、それは起こりません。結局、(nothrow)新しいものは何かに適しているようです:-)
編集:なぜ私がこれを求めているのかについて:
デバッグ中にこの質問について考えました (デバッガーの 1 回目のチャンス / 2 回目のチャンスの例外処理):また、すでに十分に予測され、コードで処理されている bad_alloc 例外もキャッチしました。それはそれほど大きな問題ではありませんでしたが、例外は例外的な状況のためのものであり、コード内のすべての奇妙な呼び出しが例外的ではないことをすでに期待しているという説教が行われていることに気づきました。
正当な用途がある場合new (nothrow)
は、 vector-notrow-reserve にもあります。