티스토리 뷰

C++/Design Pattern

Design Pattern : RAII 패턴

신우섭 2020. 3. 18. 17:46

C++ 창시자인 비야네 스트로스트룹은 C++ 에서 자원을 관리하는 방법으로 다음과 같은 디자인 패턴을 제안하였습니다.

바로 흔히 RAII 라 불리는 자원의 획득은 초기화다 - *Resource Acquisition Is Initialization* 입니다. 이는 자원 관리를 스택에 할당한 객체를 통해 수행하는 것입니다.

예외가 발생해서 함수를 빠져나가더라도, 그 함수의 스택에 정의되어 있는 모든 객체들은 빠짐없이 소멸자가 호출됩니다(이를 stack unwinding 이라 한다고 했었죠). 물론 예외가 발생하지 않는다면, 함수가 종료될 때 당연히 소멸자들이 호출되지요.

그렇다면 생각을 조금 바꿔서 만약에 이 소멸자들 안에 다 사용한 자원을 해제하는 루틴을 넣으면 어떨까요?

예를 들어서 객체를 가리키는 일반 포인터의 경우 객체가 아니기 때문에 소멸자가 호출되지 않습니다.

그렇다면 그 대신에, 일반적인 포인터가 아닌, 포인터 '객체' 로 만들어서 자신이 소멸 될 때 자신이 가리키고 있는 데이터도 같이 delete 하게 하면 됩니다.

즉, 자원 (이 경우 메모리) 관리를 스택의 객체 (포인터 객체) 를 통해 수행하게 되는 것입니다.

이렇게 똑똑하게 작동하는 포인터 객체를 스마트 포인터(smart pointer)라고 부릅니다.

C++ 11 이전에, 이러한 문제를 해결하기 위해 auto_ptr 란게 잠시 등장했었지만, 너무나 많은 문제들이 있었기에 사용을 권장하지 않습니다. (아니, 아예 사용을 금지한다고 보는 것이 맞습니다.)

C++ 11 에서는 auto_ptr 를 보완한 두 가지 형태의 새로운 스마트 포인터를 제공하고 있습니다.

바로 unique_ptr  shared_ptr 입니다.

 

출처 : https://modoocode.com/229

'C++ > Design Pattern' 카테고리의 다른 글

Design Pattern : 싱글톤(singleton) 패턴  (0) 2020.06.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함