{

.. 실패하지 않는다가 아니라. 실패해서는 안된다가 더 적당할 듯 싶다.

왜 그럴까? 각개 격파해서 정리한다.

디스트럭터에서 실패하면 왜 안되는가?
객체의 소멸 시점은, 자신이 속한 지역을 벗어 날 때이거나, 명시적으로 없애고자 할 때이다. 자신이 속한 지역에서 벗어 날 때는 무척 광범위한 영역에서 발생 할 수 있는데, 대표적으로 값에 의한 전달을 이용하는 함수에서 많이 일어 날 수 있을 것 같다.

값이 복사 되고 예외가 발생 했다고 치자. 이때 예외가 발생해서 지역을 탈출 하려고 하는데, 탈출 시 "스택 되감기"가 이루어 지면서, 다시 소멸자가 호출 되어 지고, 여기서 예외가 발생 한다 치자.

그러면 예외 중에 예외가 발생 한 것이니, C++ 에선 그냥 프로그램을 죽이는 함수를 호출 한다. 프로그램이 한순간 죽어 버린다면, .. 어찌하겠는가~

또한 표준 컨테이너에 객체들을 넣어 두었다가, 차례로 소멸 시킬 때 예외가 발생 한다면, 컨테이너에 소멸되지 않은 수 많은 메모리가 성불하지 못하고, 컴퓨터에 떠 다니는 꼴이 된다.

단순한 예로 배열에서도 같은 일이 일어 날 수 있다.

재할당, swap은 어떠한가?
위험성이 디스트럭터보다 컸으면 컷지 절대로 크진 않다. 컨테이너, 배열, 함수 호출 등에서 매우 불안불안 해 지게 된다.

그러면 어떻게 해야 하는가?
예외 발생이 되지 않게 코드를 짠다. ( ...... )

}

'책 정리 > C++ Coding Standards : C++ 코딩의 정석' 카테고리의 다른 글

항목 56 : 필요하다면 실패가 없는 swap을 활용하라. ( Whenever it makes sense, provide a no-fail swap (and provide it correctly) )  (0) 2009.04.06
항목 55 : 정규형의 할당 방식을 사용하라. ( Prefer the canonical form of assignment. )  (0) 2009.04.06
항목 54 : 개체의 조각화를 피하라. 기반 클래스 내에서의 복사보다는 Clone을 활용하라. ( Avoid slicing. Consider Clone instead of copying in base classes. )  (0) 2009.04.06
항목 53 : 복사의 허용 여부는 명확하게 지정하라. ( Explicitly enable or disable copying. )  (0) 2009.04.06
항목 52 : 일관된 방식으로 복사하고 제거하라. ( Copy and destroy consistently. )  (0) 2009.04.03
항목 50 : 기반 클래스 디스트럭터는 공용과 가상 또는 보호와 비가상으로 만들어라. ( Make base class destructors public and virtual, or protected and nonvirtual. )  (0) 2009.04.03
항목 49 : 컨스트럭터와 디스트럭터에서는 가상 함수의 호출을 피하라. ( Avoid calling virtual functions in constructors and destructors. )  (0) 2009.04.03
항목 48 : 컨스트럭터 내에서 할당 대신 초기화를 사용 하라. ( Prefer initialization to assignment in constructors. )  (0) 2009.04.01
항목 47 : 멤버 변수의 정의와 선언은 같은 순서로 하라. ( Define and initialize member variables in the same order. )  (0) 2009.04.01
항목 46 : 특정한 클래스에 맞는 new를 제공한다면, 모든 표준 형식을 제공해야 한다. ( If you provide any class-specific new, provide all of the standard forms (plain, in-place, and nothrow). )  (0) 2009.04.01
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기