사실상 C++에만 존재하는 디자인패턴으로 직역하면 '자원 획득은 초기화이다' 라는 의미이다.
가비지 콜렉터가 존재하지 않는 C++에서 보다 안전하게 동적 자원을 관리할 수 있게 해주는 패턴이라고 생각하면 이해가 편합니다. unique_ptr, shared_ptr, weak_ptr 와 같은 스마트 포인터에 활용되는 개념입니다.
아래의 코드에서 예외가 발생하여 함수가 즉시 종료되므로 delete문이 실행되지 않으면 메모리 누수가 발생합니다.
int* a = new int[100];
throw 0;
delete[] a; //실행안됨!
결국 이를 방지하기 위해 선택한 방법이 RAII 패턴으로 간단히 설명하면 자원해제를 소멸자에서 해준다는 점입니다.
Class A
{
public:
A()
{
a = new int[100];
}
~A()
{
delete[] a;
}
private:
int* a;
}
int main()
{
A a;
throw 0; //소멸자 호출
}
이제는 위의 상황처럼 예외가 발생하면, 그 함수를 위해 만들어진 스택 공간을 반환하게 되는데, 이 때 소멸자가 호출됩니다. 이로써 명시적인 delete 키워드 없이 안전하게 메모리를 반환할 수 있게 됩니다. 사용자가 직접 delete 호출하는 것보다 실수를 할 상황도 많이 줄어들기 때문에 좀 더 안전합니다.
http://occamsrazr.net/tt/297
류광님의 블로그에서 자원 초기화 시점과 객체의 유효성의 관점에서 이를 좀더 심오하게 다루었으니 더 궁금하신 내용이 있다면 찾아보는 것도 좋을 것 같습니다.