C++ 예외 처리 - RAII

진경천·2023년 10월 30일
0

C++

목록 보기
65/90

RAII (Resource Equation Is Initialization) - 자원을 얻는 것은 초기화다.
스코프를 벗어나면 소멸자를 호출하는 메커니즘을 이용해 자원을 초기화 하는 것.
자원을 사용하고 해제 할때 사용하는 기법

예제

#include <iostream>

using std::cout, std::endl;

class Test {
public:
	~Test() {
		cout << "~Test" << endl;
	}
};

void func() {
	throw "exception";
}

int main() {
	try {
		Test t;
		func();
	}
	catch (const char* e) {
		cout << e << endl;
	}
}
  • 실행 결과

    exception

동적 할당을 하게 되면 소멸자가 호출되지 않는 것을 볼 수 있다.

#include <iostream>

using std::cout, std::endl;

class Test {
public:
	~Test() {
		cout << "~Test" << endl;
	}
};

class RAII {
public:
	int* i;
	RAII() {
		i = new int;
	}
	~RAII() {
		cout << "~RAII" << endl;
		delete i;
	}
};

void func() {
	throw "exception";
}

int main() {
	try {
		RAII raii;
		func();
	}
	catch (const char* e) {
		cout << e << endl;
	}
}
  • 실행 결과

    ~RAII
    exception

unique_ptr

전형적인 RAII 기법을 사용한 예외처리

std::unique_ptr<자료형> 변수(new 자료형);
class Test {
public:
	~Test() {
		cout << "~Test" << endl;
	}
};

void func() {
	throw "exception";
}

int main() {
	try {
		std::unique_ptr<Test> test(new Test());
		func();
	}
	catch (const char* e) {
		cout << e << endl;
	}
}
  • 실행 결과

    ~Test
    exception

profile
어중이떠중이

0개의 댓글