지긋지긋하고 힘빠지는 예외안전성 생각하기의 막바지 항목이다. 이번 항목은 아주 중요한 질문을 던진다고 한다.
....
결론부터 말하자면, 예외에 안전하다.
이것은 C++ 표준 사항에서 규정된 사항인데, 아래 규정을 보도록 하자.
이런 것들을 보증하기 위해 아주 간단하고 완벽한 함수가 있으니 그것이 바로 swap 함수 이다. 원리는 비껴가기 트릭 이라고 둘러댄다.
하지만 이런 C++ 표준 사항에도 예외 사항을 두었으니,
C++ 표준 라이브러리가 예외에 안전한가?
....
결론부터 말하자면, 예외에 안전하다.
이것은 C++ 표준 사항에서 규정된 사항인데, 아래 규정을 보도록 하자.
- 표준 컨테이너에서 반환되는 모든 반복자는 예외에 안전하고 예외를 던지지도 않으며 복사 될 수 있다.
- 모든 표준 컨테이너는 모든 연산에 대한 기본 보증을 구현해야 하며, 항상 파괴와 예외가 있어도 견고한 상태를 유지 할 수 있어야 한다.
- 모든 컨테이너는 또한 반드시 모든 연산에 대해서 강한 보증을 구현해야 한다. 이것의 의미는 수행-또는-되물림(commit-or-rollback) 의 논리를 갖어야 한다는 의미이다. 성공하거나, 그 어떤 영향을 미치지 않거나 둘중 하나가 되도록 해야 한다( 표준 사항 )
이런 것들을 보증하기 위해 아주 간단하고 완벽한 함수가 있으니 그것이 바로 swap 함수 이다. 원리는 비껴가기 트릭 이라고 둘러댄다.
하지만 이런 C++ 표준 사항에도 예외 사항을 두었으니,
- 모든 컨테이너에 대해서 다중 요소 삽입은 절대로 강한 예외 안전성을 갖지 못한다. 예를 들자면, 배열을 담는다 든지, 배열을 포장한 클래스를 담는다 든지 등을 뜻한다.(이 경우는 항목 16에서 설명 했다.)
- vector<T> 와 deque<T>만은 T의 복사 생성자와 할당연산자에서 예외를 던지지 않아야지만 강한 예외 안전성을 갖는다.( 왜냐하면 이 녀석들 자체는 배열형태로 유지되고, 복사 생성자와 할당 연산자를 통하여 값을 쓰기 때문이다. 즉, placement new 를 이용하기 때문)
총평
.. 머리에 잘 들어 오지 않아 한참 걸렸다. 예외가 얼마나 자주 발생하길래 이런걸 생각해야 되지? 라고 생각했었으나, 예외가 발생되는 것을 보고 최소한 swap 은 써줘야 겠구나 생각을 굳히게 되었다.'책 정리 > Exceptional C++' 카테고리의 다른 글
Exceptional C++ 차례 (0) | 2008.12.01 |
---|---|
항목 19 : 코드 복잡성 - 파트 2 (난이도 7) (0) | 2008.12.01 |
항목 16 : 예외에 안전한 코드를 작성하기 - 파트 9 (난이도 8) (0) | 2008.11.28 |
항목 15 : 예외에 안전한 코드를 작성하기 - 파트 8 (난이도 9) (2) | 2008.11.27 |
항목 14 : 예외에 안전한 코드를 작성하기 - 파트 7 (난이도 5) (0) | 2008.11.26 |
항목 13 : 예외에 안전한 코드를 작성하기 - 파트 6 (0) | 2008.11.25 |
항목 24 : 상속의 사용과 남용 (난이도 6) (2) | 2008.10.26 |
항목 23 : 클래스 관계 - 파트 2 (난이도 6) (0) | 2008.10.25 |
항목 22 : 클래스 관계 - 파트 1 (난이도 5) (0) | 2008.10.19 |
항목 21 : 가상 함수들의 재정의 (난이도 6) (0) | 2008.10.19 |
최근댓글