코드를 강력한 예외 안전으로 만들 때마다 시간이 많이 걸리기 때문에 코드를 작성하지 않는 것이 좋습니다. 이 비교적 간단한 스 니펫을 고려하십시오.
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
호출 에 범위가 지정된 포인터를 사용할 수 있습니다 . 이렇게하면 호출 중 하나라도 예외를 발생시키는 경우 메모리 누수가 방지됩니다.
그러나 강력한 예외 보증을 구현하고 싶다고 가정 해 봅시다. 적어도, 나는 내 컨테이너에 대한 공유 포인터 (내가 부스트를 사용하지 않는)하는 nothrow 구현해야 Entity::Swap
원자 구성 요소를 추가하고, 원자 모두에 추가하기위한 관용구 어떤 종류의 Vector
와 Map
. 구현하는 데 시간이 오래 걸리고, 안전하지 않은 예외 솔루션보다 훨씬 더 많은 복사가 필요하므로 비용이 많이 듭니다.
궁극적으로 간단한 CreateEntity
기능이 예외적으로 안전 하도록 모든 것을하는 데 걸린 시간이 정당화되지는 않는다고 생각 합니다. 어쩌면 게임이 오류를 표시하고 그 시점에서 닫히기를 원할 것입니다.
자신의 게임 프로젝트에서 이것을 얼마나 멀리 가지고 있습니까? 예외가있을 때 충돌 할 수있는 프로그램에 대해 안전하지 않은 예외 코드를 작성하는 것이 일반적으로 허용됩니까?