1. 스택 풀기의 개념
Stack Unwinding은 실행 시간에 함수 호출 스택에서 함수 항목을 제거하는 프로세스다. 로컬 개체는 구성된 역순으로 파괴된다.
스택 풀기는 일반적으로 예외 처리와 관련이 있다. C++에서 예외가 발생하면, 함수 호출 스택에서 예외 처리기를 선형으로 검색하고, 예외 처리기가 있는 함수 이전의 모든 항목을 함수 호출 스택에서 제거한다. 따라서 예외 처리는 동일한 함수(예외가 던져지는 곳)에서 예외를 처리하지 않으면, 스택 풀기를 포함하는 것이다. 기본적으로 스택 풀기는 런타임에 구성된 모든 자동 개체에 대해 (예외가 던져질 때마다) 파괴자를 호출하는 프로세스다.
예시:
// CPP Program to demonstrate Stack Unwinding
#include <iostream>
using namespace std;
// A sample function f1() that throws an int exception
void f1() throw(int)
{
cout << "\n f1() Start ";
throw 100;
cout << "\n f1() End ";
}
// Another sample function f2() that calls f1()
void f2() throw(int)
{
cout << "\n f2() Start ";
f1();
cout << "\n f2() End ";
}
// Another sample function f3() that calls f2() and handles
// exception thrown by f1()
void f3()
{
cout << "\n f3() Start ";
try {
f2();
}
catch (int i) {
cout << "\n Caught Exception: " << i;
}
cout << "\n f3() End";
}
// Driver Code
int main()
{
f3();
getchar();
return 0;
}
출력:
f3() Start
f2() Start
f1() Start
Caught Exception: 100
f3() End
① f1()이 예외를 던지면, f1()이 던진 예외에 대한 예외 처리기를 포함하지 않으므로, 함수 호출 스택에서 해당 항목이 제거되고, 호출 스택의 다음 항목이 예외 처리기를 찾는다.
② 다음 항목은 f2()다. f2()에도 핸들러가 없기 때문에 함수 호출 스택에서 항목이 제거된다.
③ 함수 호출 스택의 다음 엔트리는 f3()이다. f3()에는 예외 핸들러가 포함되어 있으므로, f3() 내부의 catch block이 실행되고, 마지막으로 catch block이 실행된 후의 코드가 실행되는 것이다.
※ f1() 및 f2() 내부의 다음 행은 전혀 실행되지 않는다.
cout<<"\n f1() End "; // inside f1()
cout<<"\n f2() End "; // inside f2()
만일 f1() 및 f2() 내부에 로컬 클래스 개체가 있는 경우, 스택 풀기 프로세스에서 해당 로컬 개체에 대한 destructor가 호출되었을 것이다.
'C++' 카테고리의 다른 글
C++ 람다식(Lambda expression) 총정리 (2) | 2024.04.25 |
---|---|
C++사용자 정의 예외 (0) | 2024.04.25 |
C++ 클래스를 이용한 예외 처리 (0) | 2024.04.24 |
C++ 예외 처리(Exception Handling) 총정리 (0) | 2024.04.23 |
C++에서 가상 함수(Virtual function)은 private이 가능할까? (0) | 2024.04.19 |