안전한 C++ 라이프를 위한 스마트포인터에 대해 정리를 해봤습니다. (2012년 현재) 

마지막 한줌의 속도라도 짜내야하는 그런 부분 제외하고는 웬만하면 C++ 말고 다른것을 사용하라고 조언드리고 싶고, Rust 의 빠른 발전을 기대합니다.  



1. Scoped_ptr (boost)

0. 복사불가 단일 소유자
1. 
한마디로 scoped_ptr 는 복사할 수 없는 auto_ptr 이다. 
2. 
젤 가볍습니다.
3. 
제한적이다. (한 함수 내에서만 동적할당해서 쓰다가 함수를 끝낼 때는 삭제해야 하는 임시 객체를 처리할 때도 유용하게 쓰일 수 있습니다)
4. 
이 스마트포인터를 포함하고있는 클래스도 복사불가입니다.
5. "
자원 획득은 초기화 이다." 만을 위해 존재한다. 레퍼런스 카운팅이 없고, 소유권공유,이전문제도 없다.
6. 
명확한 쓰임새를 위해서 비전에서 이것으로 교체하는게 좋을듯합니다.
7. STL 
컬렉션과 함께 사용불가


2. Scoped_array (boost)

0. 동적으로 할당한 배열에 대해 사용
1. 
복사불가 단일 소유자
2. 
동적인 배열이 필요하다면 std::vector라는 훌륭한 대체 수단이 이미 존재하는 관계로, 
이 scoped_array의 사용 목적은 주로 오래되고 복잡한 코드를 유지 보수하면서 혹시나 delete[]를 잊을 수도 있는 후임자를 위해 사용해라가 되겠습니다.


3. auto_ptr (C++98)

0. 복사가능 단일 소유자
1. 
한마디로 복사할수있는 Scoped_ptr 입니다.
2. A->B 
로 복사하고나서 A 가 소멸되면 B 스마트포인터는 빈곳을 가르킨다면 대략 낭패입니다.
3. 2
번 문제를 해결하고자 auto_ptr에서는 소유권을 이전시켜버립니다. A 는 복사하는순간 쓸모없어지는것이지요.
4. 
레퍼런스카운팅을 하지 않는다. (단지 소유권 이전으로 단일 소유자만 존재)
5. STL 
컬렉션과 함께 사용불가


4. shared_ptr (C++TR)

: 0. 복사가능 공유소유자
: 1. 
레퍼런스 카운팅을 통해 공유를한다. 가장 마지막 소유자가 제거될때까지 힙에 존재합니다.
: 2. STL 
컬렉션과 함께 사용가능
: 3. 
가장 무겁다.
: 4. Copy on write 
는 아니다. 한쪽에서 값이 바뀌면 다 모든 소유자가 다 바뀜.


5. weak_ptr (boost)

: 0.weak_ptr 는 share_ptr 로 초기화 되어야 한다는 제약.(즉 이것은 share_ptr와 관련되어서만 사용해야함.)
: 1.weak_ptr
은 객체의 생명주기에 영향을 주지 않는다. (레퍼런스 카운팅에 영향을 안준다는뜻)
: 2.enable_shared_from_this<>
는 내부적으로 weak_ptr을 이용하여 this 포인터의 shared_ptr 전달 문제를 해결하고 있다.
: 3.
보통 shared_ptr 의 circular reference 문제를 해결하기위해 사용된다.

6. unique_ptr (C++11)

: 0. auto_ptr와 shared_ptr 사이의 절충안
: 1. unique_ptr
은 기본적으로 auto_ptr와 유사하게 소유권의 이전에 기반한 동작을 한다
: 2. 
그러나 일반 복사 생성, 대입 연산이 아닌 C++11에서 새롭게 추가된 R-value reference를 이용한다는 것이다.
: 3. C++11
에서 STL 컨테이너에서도 효율성을 위해 내부적인 복사 및 대입 동작은 전부 R-value reference를 이용하도록 바뀌었는데, 
일반 복사 및 대입 연산자를 막아 버리는 대신 R-value reference를 이용한 복사 및 대입 연산자만 정의한다면 STL에서도 사용할 수 있는 auto_ptr가 생긴다는 것이 unique_ptr의 의미이다.
: 4. STL 
컨테이너에서도 사용할 수 있다.
: 5. raw pointer
에 비해 추가적인 오버헤드도 없는 스마트 포인터라 할 수 있다. 의미적인 뚜렷함과 안전한 사용을 위해 대부분의 암시적인 변환이 막혀 있고, 일반적인 대입 및 복사가 막혀있으므로 
unique_ptr 
끼리의 대입에는 std::move 함수를 명시적으로 사용해야 하는 등 코딩량이 다소 늘어난다는 불편함이 있으나, 안전하고 속도개선의 코딩을 위해서라면 이 정도는 충분히 감수할 만 하다.

'C++ (비공개)' 카테고리의 다른 글

C API 와 C++(STL) 호환에 관한 팁  (0) 2019.03.24
C++ 50 계명 - 이것만은 기억하자.  (1) 2019.03.19

+ Recent posts