[C++] 스마트 포인터
스마트 포인터
포인터는 많은 오류의 원인이 되기 쉽다.
가장 큰 이유는 메모리의 해제 때문인데 코딩 공부 초장기에 많이 겪어봤을 것이다.
이런 문제를 회피하기 위해 스마트 포인터가 등장했다.
스마트 포인터를 사용하더라도 포인터를 잘못 사용하거나 이상한 일이 생길 수 있으므로 너무 믿지 말자.
모든 스마트 포인터는 <memory> 헤더에 정의되어 있다.
C++11부터 2가지의 스마트 포인터가 제동된다.
shared_ptr
공유 소유권(shared ownership)이라는 개념을 구현한다.
여러 스마트 포인터가 동일한 객체를 참조할 수 있다.
때문에 객체와 그 객체가 가진 자원은 객체에 대한 마지막 포인터가 소멸될 때 같이 소멸된다.
즉, 객체를 가리키고 있는 포인터가 하나도 없을 때 소멸된다.
unique_ptr
베타 소유권(exclusive ownership)이라는 개념을 구현한다.
이 포인터는 해당 객체를 참조하는 스마트 포인터가 한 번에 하나만 존재한다고 가정한다.
즉, 객체를 가리키고 있는 스마트포인터는 1개만 존재한다.
대신 소유권을 전달할 수 있다.
이 포인터는 new로 생성한 후 예외가 발생하여 delete를 하지 못하는 상황에서 메모리 누수를 막는데 유용하다.
C++11에서 두 개의 스마트 포인터를 제공하는 이유는 성능 차이에 있다.
shared_ptr은 하나의 객체를 여러개의 포인터가 가리킬 수 있으며 가리키고 있는 포인터들을 참조하고 있어야 한다.
그래야 객체를 가리키고 있는 포인터가 몇 개인지 알 수 있을테니까.
따라서 내부적으로 다른 도우미 객체들이 필요하다,
이는 몇가지 특정 최적화를 적용할 수 없게 되고 성능상 떨어지게 된다.
unique_ptr은 이런 부하가 없으며 특별한 생성자,소멸자를 사용하며 복사 문맥을 제거했기 때문에 더욱 스마트하다.
스마트 포인터는 완벽한 포인터가 아니다.
너무 스마트 포인터에 의존하여 메모리 누수를 방지 하지 말고 유심히 잘 생각하여 설계하자.
'[프로그래밍 공부] > C&C++' 카테고리의 다른 글
[C] while문 안에서 scanf 받기 (0) | 2022.01.13 |
---|---|
[C++] 가상 함수 (Virtual Function) (0) | 2022.01.08 |
[C++] 클래스 상속(inheritance) (0) | 2022.01.01 |
[C++] 클래스 생성자와 소멸자 (0) | 2022.01.01 |
[C++] 오버로딩과 오버라이딩 차이 (0) | 2022.01.01 |