항목8 - 예외가 소멸자를 떠나지 않도록 붙들어 놓자
2022.05.25
예외가 소멸자를 떠나지 못하도록 붙들어 놓자.
소멸자가 호출 되는 경우
1. 정상적으로 객체가 종료되었을 때
2. 예외처리 메커니즘에 의해 객체가 소멸될 때
소멸자가 예외가 있으면 안되는 이유
예를 들어 10의 크기를 갖는 벡터 v가 있다. 함수를 사용한 다음에서야 10개 만큼 메모리가 해제된다.
만약 v의 첫번째 주소에서 문제가 생겨 예외가 발생했다면??? -> 나머지 2~10의 메모리가 누수되는 것이다.
다른 예를 들어
class DBConn
{
public:
~DBConn()
{
db.close();
}
private:
DBConnection db;
};
위 코드에서 프로그램이 종료되기 위해 ~DBConn() 호출하였는데, 여기서 예외 발생 시,
프로그램이 미정의 동작을 발생시킬 것이다. 그냥 예외가 남은채로 끝나는 것이다.
소멸자에서 예외가 나면 해결방법!
1. close에서 예외가 발생하면 프로그램을 바로 끝내라. -> 에러 발생 후에 프로그램 지속이 어려운 경우 괜찮은 선택이다.
2. close를 호출한 곳에서 일어난 예외를 무시하라. -> 예외를 무시한 뒤라도 프로그램이 신뢰성 있게 실행 될 수 있는 상태일 경우.
3. close 호출 책임을 소멸자에서 사용자로 넘겨라!
정리
1. 일반적으로 C++은 예외를 내보내는 소멸자를 좋아하지 않는다.
2. 예외는 소멸자가 아닌 다른 함수에서 비롯된 것이어야 한다! -> 소멸자에 있다면 사용자는 예외에 대처할 기회가 없다. 임시방편으로 무시할뿐.
3. 소멸자에서 예외가 발생하지 않도록 하자! -> 예외는 소멸자가 아닌 함수에서 처리하도록 하자!
4. 소멸자에서 호출되는 함수가 예외 가능성이 있다면 -> 소멸자에서 삼켜버리던지, 프로그램을 종료하던지 처리하자.
5. 소멸자에서 예외가 생길 경우 자체를 배제해서 코드를 작성하는 것이 최선이다.
댓글을 작성해보세요.