본문 바로가기
C.C++/전반

RAII

by 겜게준 2018. 5. 23.

RAII (Resource Acquisition is initialization) 은 사용 전에 획득되야하는 자원의 생명주기를 오브젝트의 생명주기에 바인딩하는 기술이다.


쉽게 말하자면 초기화 (사용되기 전) 에서 자원 획득을 해야하며 자원은 초기화단계에서 획득이 되어야한다라고 볼 수 있다.



cppreference에는 RAII의 이점을 다음과 같이 설명하고 있다.


RAII guarantees that the resource is available to any function that may access the object 


RAII는 오브젝트에 접근할 수 있는 어떠한 함수에서도 자원이 유효하다는 것을 보장한다.



 It also guarantees that all resources are released when the lifetime of their controlling object ends, in reverse order of acquisition


제어중인 객체의 수명주기가 끝이나면 획득의 역순으로 자원들이 해제되는것을 보장한다.


Likewise, if resource acquisition fails (the constructor exits with an exception), all resources acquired by every fully-constructed member and base subobject are released in reverse order of initialization.


자원 획득이 실패할 경우 (생성자가 예외와함께 종료), 모든 Fully-constructed[각주:1] 멤버와 하위객체가 초기화의 역순으로 해제된다. 


This leverages the core language features (object lifetimescope exitorder of initialization and stack unwinding) to eliminate resource leaks and guarantee exception safety.


이는 자원 누수와 예외 안전성[각주:2]을 보장하기 위해 언어의 핵심 기능을 활용한다.


이는 다음을 뜻한다.


- 객체가 생성이 완료됬다면 그 객체는 유효하다. 즉, 생성이 완료된 객체는 유효한 객체여야한다.

- 획득하지 못한 자원이 있으면 그 객체는 유효하지 않다.

- 객체의 수명주기가 끝나게 되면 모든 자원이 해제되어 유효하지 않게된다.



아마 이전에 RAII를 들어보았다면 보통 객체가 해제되는 관점으로 알고 있을 것이기 때문에 조금 이해가 안될 수 있는데, RAII는 SBRM (Scope Bound Resource Management) 라고도 불린다.


SBRM을 요약하자면 C++은 객체가 속한 스코프가 종료될 경우 공간을 해제되기전 (스택 언와인딩)에 공간에 할당된 객체들의 소멸자를 호출하게 되는데, 이 소멸자 호출할 시점에 객체에 할당된 자원들을 해제하는 것이다. 이를 이용한 것은 대표적으로 스마트포인터가 있다.


아주 간단하게 스마트 포인터를 구현해보았다. (예시를 위해 작성함)


template <typename T>

class smart_ptr

{

private:

T* ptr = nullptr;

public:

smart_ptr(T* ptr)

{

this->ptr = ptr;

}

~smart_ptr()

{

delete ptr;

ptr = nullptr;

}

T& operator*()

{

return *ptr;

}


T* operator=(T* ptr)

{

this->ptr = ptr;

return this->ptr;

}

};



  1. 완전히 생성된 멤버 [본문으로]
  2. 예외가 던져지면 예외와함께 스택 언와인딩된다. 그런데 여기서 문제점은 소멸자가 호출되지 않는다. [본문으로]

'C.C++ > 전반' 카테고리의 다른 글

파라미터에서 Pointer, Reference  (0) 2017.06.22
다차원 배열  (0) 2017.06.20
네이밍  (2) 2017.05.06

댓글