RAII는 자원을 클래스의 생성자에서 획득(Acquire)하고, 소멸자에서 해제(Release)하는 디자인 패턴이다.
std::unique_ptr, std::shared_ptr 같은 스마트 포인터뮤텍스 관리 클래스 예제
class Lock {
public:
explicit Lock(Mutex* pm) : mutexPtr(pm) { lock(mutexPtr); } // acquire resource
~Lock() { unlock(mutexPtr); } // release resource
private:
Mutex* mutexPtr;
};
lock),unlock)하는 방식으로 동작한다.위 코드에서 Lock 객체를 복사하면 어떤 일이 일어날까?
Mutex m;
Lock ml1(&m);
Lock ml2(ml1)
ml2가 ml1 의 mutexPtr을 복사하면, 뮤텍스 하나를 두 개의 Lock 객체가 관리하게 됨.ml2가 소멸되면 뮤텍스가 한 번 해제되고, m1가 소멸될 때 이미 해제된 뮤텍스를 다시 해제하려고 할 수 있음.1. 복사 금지