C++

C++ 스택 풀기(Stack Unwinding)

김구티2 2024. 4. 24. 20:33

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가 호출되었을 것이다.

728x90