Program Language/C & C++

[C++] Finally

야곰야곰+책벌레 2022. 1. 13. 15:28
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