3

この質問を読む前は、例外処理を真剣に考えたことがありませんでした。今では必要性を感じていますが、それでも「例外セーフなコードを書くのは非常に難しい」と感じています。

その質問の受け入れられた回答でこの例を参照してください。

void doSomething(T & t)
{
   if(std::numeric_limits<int>::max() > t.integer)  // 1.   nothrow/nofail
      t.integer += 1 ;                              // 1'.  nothrow/nofail
   X * x = new X() ;                // 2. basic : can throw with new and X constructor
   t.list.push_back(x) ;            // 3. strong : can throw
   x->doSomethingThatCanThrow() ;   // 4. basic : can throw
}

答えが言うように、私は を使用することで簡単に基本的な保証を提供できますstd::unique_ptr。ただし、 a をキャッチすると、それがorstd::bad_allocで発生するかどうかがわからないため、 t.list がまだ「良好」なのか、それとも最後の要素が完全に準備されていないのかはわかりません。その場合、唯一の選択肢は、t がプログラム全体に不可欠である場合、t を破棄し、恐ろしいメッセージを表示して中止することです。push_backx->doSomethingThatCanThrow()

強力な保証を持つコードには問題はありませんが、「コストが高くなる可能性があり」(この例では大きなリストのコピーが含まれます)、それほど読みにくくなります。

可能な解決策はnew、メモリが利用可能になるまで待機させ、最も厄介な例外を削除することですstd::bad_alloc。次に、 2. と 3. はスローしません (Xの構築とコピーが常に成功する場合)。4. を try ブロックでラップし、ここで例外を処理する (そしてリストを pop_back する) ことができます。次に、関数は非スロー保証を提供し、リストには常に良いものが含まれます。

ユーザーは、100% の CPU と 100% の RAM の違いを気にしません。プログラムがハングするのを見ると、他のプログラムを閉じて、new十分なメモリを見つけて続行します。

私の質問: これは実装できますか? メモリが使用可能になるまで待機する nothrow new はありますか? #define new ...C++ が標準化される前のライブラリが一時的な 100% RAM に耐えられるように、グローバルに (たとえば によって) 適用できますか?

4

1 に答える 1