지긋지긋하고 힘빠지는 예외안전성 생각하기의 막바지 항목이다. 이번 항목은 아주 중요한 질문을 던진다고 한다.

C++ 표준 라이브러리가 예외에 안전한가?



....
결론부터 말하자면, 예외에 안전하다.

이것은 C++ 표준 사항에서 규정된 사항인데, 아래 규정을 보도록 하자.
  • 표준 컨테이너에서 반환되는 모든 반복자는 예외에 안전하고 예외를 던지지도 않으며 복사 될 수 있다.
  • 모든 표준 컨테이너는 모든 연산에 대한 기본 보증을 구현해야 하며, 항상 파괴와 예외가 있어도 견고한 상태를 유지 할 수 있어야 한다.
  • 모든 컨테이너는 또한 반드시 모든 연산에 대해서 강한 보증을 구현해야 한다. 이것의 의미는 수행-또는-되물림(commit-or-rollback) 의 논리를 갖어야 한다는 의미이다. 성공하거나, 그 어떤 영향을 미치지 않거나 둘중 하나가 되도록 해야 한다( 표준 사항 )

이런 것들을 보증하기 위해 아주 간단하고 완벽한 함수가 있으니 그것이 바로 swap 함수 이다. 원리는 비껴가기 트릭 이라고 둘러댄다.

하지만 이런 C++ 표준 사항에도 예외 사항을 두었으니,

  1. 모든 컨테이너에 대해서 다중 요소 삽입은 절대로 강한 예외 안전성을 갖지 못한다. 예를 들자면, 배열을 담는다 든지, 배열을 포장한 클래스를 담는다 든지 등을 뜻한다.(이 경우는 항목 16에서 설명 했다.)
  2. vector<T> 와 deque<T>만은 T의 복사 생성자와 할당연산자에서 예외를 던지지 않아야지만 강한 예외 안전성을 갖는다.( 왜냐하면 이 녀석들 자체는 배열형태로 유지되고, 복사 생성자와 할당 연산자를 통하여 값을 쓰기 때문이다. 즉, placement new 를 이용하기 때문)
뭐 이 때는 임시 객체를 이용하면, 쉽게 해결 할 수 있으니, 비껴가기 원리는 익혀 두는게 좋겠다.


총평

.. 머리에 잘 들어 오지 않아 한참 걸렸다. 예외가 얼마나 자주 발생하길래 이런걸 생각해야 되지? 라고 생각했었으나, 예외가 발생되는 것을 보고 최소한 swap 은 써줘야 겠구나 생각을 굳히게 되었다.
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기