본문 바로가기
스터디/C++

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

by 알 수 없는 사용자 2019. 12. 2.

이전 포스팅에서 함수 내에서 throw를 던진 경우에 그 함수를 호출한 영역으로 돌아가서 예외처리를 하였다.

이렇듯, 예외처리에 대한 책임은 throw가 발생한 함수를 호출한 영역으로 넘어가게 된다.

그리고 호출한 영역으로 '예외' 데이터를 전달하면, 해당 함수는 더 이상 실행되지 않고 종료가 된다.

 

이렇게 함수 내에서 예외가 처리되지 않아서,

함수를 호출한 영역으로 예외 데이터가 전달되는 현상을 가리켜 'Stack Unwinding(스택 풀기)'라고 한다.

 

위의 함수 호출 순서는 다음과 같다.

main -> One -> Two -> Three ( 스택이 쌓이는 방향 )

 

그리고 Three에서 예외를 던졌다. 그래서 다시 

Three -> Two -> One -> main ( '예외' 데이터가 전달되면서 스택이 해제되는 순서 )

 

으로 '예외' 데이터가 전달이 되어서 예외 코드가 잘 나온 것을 확인할 수 있었다.

결국 예외는 Three에서 발생했지만 예외의 처리는 main 함수에서 이뤄지는 형태가 된다. 

그런데 '예외' 데이터가 전달되면, 예외 데이터를 전달한 함수는 종료되기 때문에, '예외' 데이터를 전달한 함수의 스택이 반환되는 것은 당연하다.

 

그래서 '예외' 데이터의 전달을 가리켜서 'Stack Unwinding(스택 풀기)' 또는 스택의 반환이라고 하는 것이다.

 

만약 main에서 '예외'데이터에 대한 처리가 없다면 어떻게 될까?

그럼 terminate 함수(프로그램을 종료시키는 함수)가 호출되면서 프로그램이 종료된다.

따라서 시스템 오류로 인해서 발생한 예외상황이 아니라면, 더 이상 프로그램의 실행이 불가능한 예외상황이 아니라면,

반드시 프로그래머가 예외상황을 처리해야 한다.