每当我考虑使我的代码强烈地异常安全时,我就不这样做,因为这样做会非常耗时。考虑以下相对简单的代码段:
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
调用中使用作用域指针。如果任何调用引发异常,这将防止内存泄漏。
但是,假设我要实现一个强大的异常保证。至少,我需要实现我的容器共享光标(我不使用升压),一个无抛出Entity::Swap
的原子添加组件和某种成语的原子添加到两个Vector
及Map
。实施这些不仅耗时,而且由于与异常不安全解决方案相比涉及更多的复制,因此它们也很昂贵。
最终,在我看来,花时间做所有这些事情是不合理的,因此一个简单的CreateEntity
函数是绝对例外安全的。我可能只想让游戏显示一个错误并在该点关闭。
您在自己的游戏项目中走了多远?为可能会在出现异常时崩溃的程序编写异常不安全代码,通常是否可以接受?