728x90
반응형
소멸자를 사용하여 리소스를 클래스의 객체로 표현하는데 필요한 규율은 일부를 귀찮게 한다. 계속해서 사람들은 예외가 발생한 후 정리할 임의의 코드를 작성하기 위해 finally를 만들었다. 이러한 기술은 애드혹(adhoc)이기 때문에 일반적으로 RAII보다 좋지 않지만 원한다면 RAII는 애드혹을 제공할 수 있다. 먼저 소멸자에서 임의의 작업을 실행할 클래스를 정의한다.
template<typename F>
struct Final_action {
Final_action(F f): clean{f} {}
˜Final_action() { clean(); }
F clean;
};
finally action은 생성자에 대한 인수로 제공된다.
다음으로, 액션의 유형을 편리하게 추론할 수 있는 함수를 정의한다.
template<class F>
Final_action<F> finally(F f)
{
return Final_action<F>(f);
}
마지막으로 finally()를 테스트할 수 있다.
void test()
// handle undiciplined resource acquisition
// demonstrate that arbitrar y actions are possible
{
int∗ p = new int{7}; // probably should use a unique_ptr (§5.2)
int∗ buf = (int∗)malloc(100∗sizeof(int)); // C-style allocation
auto act1 = finally([&]{ delete p;
free(buf); // C-style deallocation
cout<< "Goodby, Cruel world!\n";
}
);
int var = 0;
cout << "var = " << var << '\n';
// nested block:
{
var = 1;
auto act2 = finally([&]{ cout<< "finally!\n"; var=7; });
cout << "var = " << var << '\n';
} // act2 is invoked here
cout << "var = " << var << '\n';
} // act1 is invoked here
결과는 다음과 같다.
var = 0
var = 1
finally!
var = 7
Goodby, Cruel world!
또한 p와 buf에 의해 할당되고 가리키는 메모리는 적절하게 delete와 free 된다.
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] Catching Exception (0) | 2022.01.13 |
---|---|
[C++] throwing exception (0) | 2022.01.13 |
[C++] 리소스 관리 (0) | 2022.01.13 |
[C++] 미리 정의된 매크로 (0) | 2022.01.13 |
[C++] constexpr 함수 (0) | 2022.01.13 |