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
전형적인 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