프로그래밍/C++

스마트 포인터의 종류

이재만박사 2016. 9. 20. 16:49

* shared_ptr


- 참조 카운팅 방식 스마트 포인터

- 가리키고 있는 객체에 대해 소유권을 가지지 않고 참조 카운트만 유지하는 포인터

- 다른 객체를 가리키면서 포인터에 대한 소유권을 공유

- 자원을 참조하는 외부 객체의 개수를 관리하다가 그 개수가 0이 되면 자동 삭제

- STL 컨테이너 사용 가능

- 가비지 컬렉션의 동작과 유사

- 가비지 컬렉션과 차이는 참조 상태가 고리를 이루는 경우는 없앨 수 있음

(서로 다른 두 객체가 서로를 참조)



* unique_ptr


- 소유권 독점 방식을 사용하는 스마트 포인터

- 복사 생성자와 대입 연산자를 제공하지 않음

- 복사할 수 없으며 소유권 이전을 위해 std::move( ) 이용

- 소유권 해제 시점은 포인터 객체가 가리키는 객체의 소멸, 대입연산, reset 메소드 에서 명시적 호출을 통해 값을 변경할 때

- 스스로 포인터의 유일성을 보장



* weak_ptr


- shared_ptr의 순환 참조로 발생하는 문제를 해결하기 위해 사용하는 특수 포인터

- 레퍼런스 카운트에 포함되지 않고 shared_ptr의 객체만 참조

- 약한 참조 (객체가 살아있도록 유지 않고, 객체가 살아있는 동안만 참조 가능)

- expired 함수를 통해 자신이 참조하는 shared_ptr 상태 확인

- 포인터에 대해 직접 접근 불가능하며, 접근을 원하면 lock( ) 을 통해 shared_ptr로 변환 뒤 shared_ptr의 get( )으로 접근