프로그래밍/C++

스마트 포인터

이재만박사 2016. 9. 19. 23:16

* C++에서 스마트 포인터를 사용하는 공통적인 이유


- 적은 버그

- 스마트 포인터를 사용함으로써 코드의 크기를 줄일 수 있다

- 이보다는 버그를 줄일 수 있는 것이 더 중요한 이유

- 스마트 포인터를 사용할 때는 delete를 명시적으로 호출할 필요가 없으므로 메모리 해제에 대해서는 잊어도 됨


- 자동 초기화

- nullptr로 초기화 하지 않아도 됨

- 디폴트 생성자가 자동으로 생성


- auto_ptr을 사용할 때 auto_ptr이 복사되는 경우 대입되는 객체가 nullptr로 설정됨





- auto_ptr이 아닌 다른 스마트 포인터들은 복사가 될 때 다른 행동을 함

- 예를 들어 다른 스마트 포인터에서는 q = p 문을 실행할 때 q와 p가 동일한 스마트 포인터인 경우 다음과 같은 전략을 취할 수도 있음


- 새로운 복사본 생성 : p가 가리키고 있는 객체에 대한 복사본을 새로 생성한 다음 q가 가리키도록 하는 전략 (copied_ptr.h)

- 소유권 이전 : p와 q가 동일한 객체를 가리키도록 하지만 해제에 관한 소유권을 p에서 q로 이전하는 전략 (owned_ptr.h)

- 참조 카운트 : 동일한 객체를 가리키고 있는 스마트 포인터의 개수를 유지하는 전략, 참조 카운트가 0이 되는 순간 객체를 삭제, q = p 문은 p가 가리키고 있는 객체의 카운트 값을 1 증가 (counted_ptr.h)

- 참조 연결 : 참조 카운트 방식과 비슷, 동일한 객체를 가리키는 모든 스마트 포인터를 circular doubly linked list로 연결 (linked_ptr.h)

- Copy on write : 참조 카운트 혹은 참조 연결 방식은 가리키고 있는 객체가 수정되지 않는 동안 사용, 수정이 필요할 때 새로운 복사본을 생성한 뒤에 복사본에 수정하는 방식 (cow_ptr.h>


- scoped_ptr, shared_array 등


- 매개 변수 목록이 아닌 별도 코드 줄에서 스마트 포인터를 만들어야 특정 매개 변수 목록 할당 규칙으로 인해 아주 작은 리소스 누수도 발생하지 않음



* 단점

- 스마트 포인터가 nullptr인지 체크 불가

- 상속 기반의 변환 제한

- 상수 객체에 대한 포인터 지원 제한

- 구현하기 까다로움

- 이해하기 쉽지 않아 유지 보수도 어려움

- 디버깅이 어려움