스마트 포인터 종류 (C++98, 11, TR1, boost)

 

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 함수를 명시적으로 사용해야 하는 등 코딩량
이 다소 늘어난다는 불편함이 있으나, 안전하고 속도개선의 코딩을 위해서라면 이 정도는 충분
히 감수할 만 하다.