티스토리 뷰
C++ 창시자인 비야네 스트로스트룹은 C++ 에서 자원을 관리하는 방법으로 다음과 같은 디자인 패턴을 제안하였습니다.
바로 흔히 RAII 라 불리는 자원의 획득은 초기화다 - *Resource Acquisition Is Initialization* 입니다. 이는 자원 관리를 스택에 할당한 객체를 통해 수행하는 것입니다.
예외가 발생해서 함수를 빠져나가더라도, 그 함수의 스택에 정의되어 있는 모든 객체들은 빠짐없이 소멸자가 호출됩니다(이를 stack unwinding 이라 한다고 했었죠). 물론 예외가 발생하지 않는다면, 함수가 종료될 때 당연히 소멸자들이 호출되지요.
그렇다면 생각을 조금 바꿔서 만약에 이 소멸자들 안에 다 사용한 자원을 해제하는 루틴을 넣으면 어떨까요?
예를 들어서 객체를 가리키는 일반 포인터의 경우 객체가 아니기 때문에 소멸자가 호출되지 않습니다.
그렇다면 그 대신에, 일반적인 포인터가 아닌, 포인터 '객체' 로 만들어서 자신이 소멸 될 때 자신이 가리키고 있는 데이터도 같이 delete 하게 하면 됩니다.
즉, 자원 (이 경우 메모리) 관리를 스택의 객체 (포인터 객체) 를 통해 수행하게 되는 것입니다.
이렇게 똑똑하게 작동하는 포인터 객체를 스마트 포인터(smart pointer)라고 부릅니다.
C++ 11 이전에, 이러한 문제를 해결하기 위해 auto_ptr 란게 잠시 등장했었지만, 너무나 많은 문제들이 있었기에 사용을 권장하지 않습니다. (아니, 아예 사용을 금지한다고 보는 것이 맞습니다.)
C++ 11 에서는 auto_ptr 를 보완한 두 가지 형태의 새로운 스마트 포인터를 제공하고 있습니다.
바로 unique_ptr 과 shared_ptr 입니다.
'C++ > Design Pattern' 카테고리의 다른 글
Design Pattern : 싱글톤(singleton) 패턴 (0) | 2020.06.23 |
---|
- Total
- Today
- Yesterday
- 람다함수
- C
- UE4
- 람다
- rotator
- c++
- unrealengine
- Trouble shooting
- c++11
- double free
- Lambda
- UE5
- bug
- coordinate system
- LambdaFunction
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |