반응형
💡 stack unwinding (스택 풀기)
예외 발생으로 catch 처리되는 중간과정에서
만들어진 stack 에 있는 모든 변수(객체)는 소멸되었기 때문이다.
[예제]
Q) f2() 에서 throw 예외 발생할 때 f1() 온전한 수행을 할 수 있을까?
#include <iostream>
struct Object
{
~Object() { printf("~Object 소멸자\n"); }
};
void f2()
{
printf("f2 start\n");
throw 1;
printf("f2 end\n");
}
void f1()
{
printf("f1 start\n");
Object obj;
f2();
printf("f1 end\n");
}
int main()
{
try
{
f1();
}
catch (...)
{
printf("catch...\n");
}
}
예외가 없을 때
f1 start → f2 start → f2 end → f1 end 가 되지만
f2에서 예외 발생하여 f2, f1가 끝까지 종료되지 못하고
바로 catch 문으로 예외 처리 되었다.

f2, f1 온전히 수행하지 못했음에도
객체 Object 소멸자가 호출되었다.
[예제] RAII 필요성
#include <iostream>
class mutex
{
public:
void lock() { printf("mutex lock\n"); }
void unlock() { printf("mutex unlock\n"); }
};
mutex m;
void fn()
{
m.lock();
printf("start\n");
throw 1;
printf("end\n");
m.unlock();
}
int main()
{
try { fn(); }
catch (...) {}
}
💡 RAII
• Resource Acquisition Is Initialization
• 자원 할당/해지를 직접 하지않고 생성자/소멸자 사용해서 관리
[예제] RAII 적용
lock_guard 에게 mutex 생성자/소멸자로 관리하면서
중간에 예외가 발생하더라도 metex unlock 되는 것을 확인할 수 있다.
#include <iostream>
class mutex
{
public:
void lock() { printf("mutex lock\n"); }
void unlock() { printf("mutex unlock\n"); }
};
mutex m;
class lock_guard
{
mutex& mtx;
public:
lock_guard(mutex& m) : mtx(m) { mtx.lock(); }
~lock_guard() { mtx.unlock(); }
};
void fn()
{
lock_guard g(m);
printf("start\n");
throw 1;
printf("end\n");
}
int main()
{
try { fn(); }
catch (...) {}
}
📌 [C++] 오류 처리 방식 (Error Handling)
[C++] 오류 처리 방식 (Error Handling)
오류 처리 방식 (Error Handling)① 약속된 함수 반환값 ② 예외(Exception) 사용 ③ 성공/실패 결과가 모두 담을 수 있는 타입 반환 [예제]Connect 실패 시 어떻게 처리할 것인가?→ 프로세스 종
zoosso.tistory.com
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C/C++] 비트 필드 구조체 (8) | 2025.03.23 |
---|---|
[C++] noexcept (3) | 2025.03.20 |
[C++] 오류 처리 방식 (Error Handling) (3) | 2025.03.17 |
[C++] 깊은 복사 (Deep Copy) (2) | 2025.03.16 |
[C++] 함수 객체 (function object) (2) | 2025.03.15 |
댓글