Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 스택 해제(Stack Unwinding) 개념과 동작 원리 쉽게 이해하기

이번 글에서는 C++의 스택 해제(Stack Unwinding)가 무엇을 의미하는지 알아보겠습니다. 프로그램에서 함수를 호출하면 해당 함수의 주소 정보가 호출 스택(call stack)에 저장되고, 함수 실행이 끝나면 스택에서 주소가 꺼내지면서 이전에 중단된 지점부터 다시 작업을 이어가게 됩니다.

스택 해제란?

스택 해제는 런타임에 함수 호출 스택의 항목들을 제거하는 과정입니다. 이때 예외(exception)를 활용하면 스택의 요소들을 제거할 수 있습니다. 내부 함수에서 예외가 발생(throw)하면, 스택에 쌓여 있던 모든 항목이 제거되고 최초의 호출자 함수로 제어권이 되돌아갑니다.

다음 예제를 통해 스택 해제가 실제로 어떻게 동작하는지 확인해 보겠습니다.

예제 코드

#include <iostream>
using namespace std;

void function1() throw (int) { // 예외를 던지는 함수
    cout<<"\n Entering into function 1";
    throw 100;
    cout<<"\n Exiting function 1";
}

void function2() throw (int) { // function1을 호출하는 함수
    cout<<"\n Entering into function 2";
    function1();
    cout<<"\n Exiting function 2";
}

void function3() { // function2를 호출하고, function1이 던진 예외를 처리하는 함수
    cout<<"\n Entering function 3 ";
    try {
        function2(); // function2 실행 시도
    }
    catch(int i) {
        cout<<"\n Caught Exception: "<<i;
    }
    cout<<"\n Exiting function 3";
}

int main() {
    function3();
    return 0;
}

실행 결과

Entering function 3
Entering into function 2
Entering into function 1
Caught Exception: 100
Exiting function 3

결과 분석

실행 결과를 보면, 먼저 function3의 정보가 스택에 저장된 후 function2로 진입하고, 다시 function1로 진입합니다. 그런데 function1에서 예외가 발생하면서 throw 100; 이후의 코드는 실행되지 않고, 스택에 쌓여 있던 모든 정보가 제거됩니다. 그 결과 제어 흐름은 function3으로 되돌아가며, catch 블록에서 예외를 받아 처리한 뒤 정상적으로 함수를 종료하게 됩니다.

이처럼 스택 해제는 예외가 발생한 지점부터 적절한 catch 블록을 찾을 때까지 호출 스택을 거슬러 올라가며 중간 함수들의 스택 프레임을 정리하는 메커니즘입니다. 참고로 C++11부터는 구식 예외 명세인 throw(int) 대신 noexcept 키워드를 사용하는 것이 권장됩니다.