예외처리 2

[Effective C++] 항목 8: 예외가 소멸자를 떠나지 못하도록 붙들어 놓자

1. 여러개의 예외는 처리가 곤란하다.만약 이러한 클래스가 있고 벡터에서 10개의 Yeoul객체를 가지고 있다고 생각해보자.class Yeoul{public: ~Yeoul(){}};void DoSomething(){ std::vectorv;} 벡터 v가 소멸될때에 벡터는 자신이 들고있던 Yeoul객체들을 소멸시켜야 할 책임을 가지고 있습니다. 만약에 첫번째 Yeoul객체를 소멸하던중 예외가 생겼다고 생각해봅시다. 나머지 9개의 객체도 소멸되어야함으로 벡터는 여전히 나머지 객체에 대해서 소멸자를 호출하게 됩니다. 그런데 두번째 Yeoul객체 역시 예외를 발생시키면 어떻게 될까요? 이렇게 예외가 2개이상이 되어버리면 C++에서 감당하기 어렵습니다. 이러한 동작의 원인은 바로 예외가 터지는 것을 내..

[C++] 스택 풀기(Stack Unwinding)

스택 풀기란?스택 풀기는 예외가 발생한 후, 적절한 catch 블록을 찾아 제어를 이동시키는 과정입니다. 이 과정에서 예외 발생 지점부터 catch 블록까지의 스택 프레임들을 풀어내는 작업이 이루어집니다.스택 풀기 과정예외 발생: 코드에서 throw 문이 실행되어 예외 객체가 생성됩니다.적절한 핸들러 검색: 현재 함수 내에서 적절한 catch 블록을 찾습니다. 없다면 호출 스택을 거슬러 올라가며 계속 검색합니다.스택 프레임 정리: 예외 발생 지점과 catch 블록 사이의 모든 스택 프레임을 풀어냅니다. 이 과정에서:해당 범위의 모든 지역 객체들의 소멸자가 호출됩니다.소멸자는 생성된 순서의 역순으로 호출됩니다.예외 처리: 적절한 catch 블록이 발견되면, 예외 객체가 해당 핸들러로 전달되고 처리됩니다.정..

C++ 2025.04.19