본문 바로가기

C++

C++) RAII 디자인 패턴

RAII: Resource Acquisition Is Initialization.

 

  • 리소스를 초기화 할 때 메모리 할당까지 이루어지는 방식이다.
  • RAII를 기반으로 만들어진게 shared_ptr, unique_ptr이 있다.

string을 예로 들어 설명 하겠다.

 

class String {
  public:
	String() {
		new char[256];
  	}
  	~String() {
    		delete[] char;
   	}
}

 

위 클래스 String은 RAII를 따르도록 구현되었다.

String의 생성자에서 메모리를 할당하고, String의 소멸자에서 메모리를 제거한다.

 

이렇게 하므로서 얻는 장점은 다음과 같다.

int main() {
   char* str = new char[256];
    
    	...
    	// 함수 실행 도중 error 발생
    	return error;
        // 메모리 leak 발생 (아래 delete를 하기 전 return 함)
        ...
        
   delete[] str;
   return success;
}

int main() {
	String str;
    
    	...
    	// error 발생
        return error;
        // 함수에서 나가면서 변수 str의 소멸자 호출 (메모리 leak 방지)
        ...
        
 return success;
}
  • 실행 도중 오류가 나서 delete를 못해주더라도 소멸자에서 delete를 부르니 걱정 없다.