본문 바로가기
프로그래밍 언어/C++

[C++] RAII & stack unwinding

by 까망 하르방 2025. 3. 19.
반응형

💡 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

댓글