Program Language/C & C++

[C++] RAII Pattern

야곰야곰+책벌레 2021. 10. 26. 18:29
728x90
반응형

  C++ 에는 RAII (Resource Acquisition Is Initialization)이라는 패턴이 있다. 리소스의 획득은 초기화다라는 뜻인데 보통 RAII Design Pattern이라고 한다. 

예를 들자면, lock_gaurd class가 있다.

class lock_guard
{	// class with destructor that unlocks mutexes
public:
	explicit lock_guard(_Mutexes&... _Mtxes)
		: _MyMutexes(_Mtxes...)
		{	// construct and lock
		_STD lock(_Mtxes...);
		}

	lock_guard(_Mutexes&... _Mtxes, adopt_lock_t)
		: _MyMutexes(_Mtxes...)
		{	// construct but don't lock
		}

	~lock_guard() _NOEXCEPT
		{	// unlock all
		_For_each_tuple_element(
			_MyMutexes,
			[](auto& _Mutex) _NOEXCEPT { _Mutex.unlock(); });
		}

	lock_guard(const lock_guard&) = delete;
	lock_guard& operator=(const lock_guard&) = delete;
private:
	tuple<_Mutexes&...> _MyMutexes;
};

lock_guard는 생성할 때 mutex를 가져와서 lock()을 잡는다. 그리고 소멸할 때 unlock()으로 해제해주게 된다.

그 외에도 unique_ptr, shared_ptr도 비슷한 동작을 한다. 이 패턴은 메모리 관리가 어려운 C++에서 메모리 누수(Memory leak)를 막을 수 있다. 

728x90
반응형

'Program Language > C & C++' 카테고리의 다른 글

[C++] 변수 묶어 사용하기 (pair, tuple)  (0) 2021.11.15
[C++] file in/out  (0) 2021.11.08
[C++] std::thread 종료 (abort() has been called)  (0) 2021.10.26
[C++] 스마트 포인터  (0) 2021.10.25
[C++] emplace_back  (0) 2021.10.25