RAII

박동현·2021년 7월 4일
0

C++공부

목록 보기
6/6

RAII (Resource Acquisition Is Initialization)

사실상 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
류광님의 블로그에서 자원 초기화 시점과 객체의 유효성의 관점에서 이를 좀더 심오하게 다루었으니 더 궁금하신 내용이 있다면 찾아보는 것도 좋을 것 같습니다.

profile
엔진 프로그래머를 목표로합니다.

0개의 댓글