コードを非常に例外安全にすることを検討するたびに、非常に時間がかかるため、それを行わないことを正当化します。この比較的単純なスニペットを考えてみましょう。
Level::Entity* entity = new Level::Entity();
entity->id = GetNextId();
entity->AddComponent(new Component::Position(x, y));
entity->AddComponent(new Component::Movement());
entity->AddComponent(new Component::Render());
allEntities.push_back(entity); // std::vector
entityById[entity->id] = entity; // std::map
return entity;
基本的な例外保証を実装するには、new
呼び出しでスコープポインターを使用できます。これにより、呼び出しのいずれかが例外をスローする場合のメモリリークを防ぐことができます。
ただし、強力な例外保証を実装したいとします。少なくとも、コンテナの共有ポインタ(Boostを使用していない)、Entity::Swap
コンポーネントをアトミックに追加するためのnothrow 、およびの両方にアトミックに追加するための何らかのイディオムを実装する必要がVector
ありMap
ます。これらは実装に時間がかかるだけでなく、例外の安全でないソリューションよりも多くのコピーを必要とするため、高価になります。
最終的には、単純なCreateEntity
関数が非常に例外安全であるように、そのすべてを行うために費やした時間が正当化されないように思えます。とにかく、ゲームにエラーを表示して、その時点で終了させたいだけでしょう。
あなたは自分のゲームプロジェクトでこれをどのくらい受け止めていますか?例外が発生したときにクラッシュする可能性のあるプログラムに対して、例外の安全でないコードを記述することは一般に許容されますか?