관리 메뉴

HAMA 블로그

스마트 포인터 종류 분석 - C++98, 11, TR1, boost - 본문

C++ (비공개)

스마트 포인터 종류 분석 - C++98, 11, TR1, boost -

[하마] 이승현 (wowlsh93@gmail.com) 2014. 8. 10. 13:52



안전한 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
Comments