안녕하세요,
재재입니다.
c++ 에서 사용하는 pointer 는 몇가지 종류가 있습니다.
이번 포스팅에서는,
c++ smart pointer vs pointer 를 설명드릴게요.
(1) c++ smart pointer 란?
c++ smart pointer 는 일반 pointer 의 단점을 보완하기 위해 만들어진,
특별한 기능을 갖는 pointer 입니다.
smart pointer 는 c++98 표준에서 최초로 정의되었으며, (auto_ptr)
개발자가 직접 관리하던 것의 일부를 자동으로 관리 할 수 있도록 하는 목적이었습니다.
이후, c++11 에서 unique_ptr, shared_ptr, weak_ptr 이 정의되었습니다.
https://en.cppreference.com/book/intro/smart_pointers
(2) c++ smart pointer 의 기능
c++ smart pointer 는 크게 3가지 기능을 가지고 있습니다.
- 메모리를 자동으로 관리 할 수 있습니다.
- 특히, 메모리의 누수 (Memory Leak) 를 막습니다.
- 얕은 복사를 수행합니다.
cf) 얕은 복사란 데이터 자체를 복사하는 게 아니라,
소유권을 관리하며 참조를 복사합니다.
반면, pointer 는 얕은 복사 및 깊은 복사가 가능합니다. (다만 추가 구현이 요구됩니다)
(3) c++ smart pointer 의 종류별 특징
앞서 언급 드렸듯,
c++ smart pointer 의 종류는 크게 3가지입니다.
- unique_ptr
- shared_ptr
- weak_ptr – shared_ptr 의 참조 횟수를 관리함.
unique_ptr 과 shared_ptr 에 대해 본격 비교를 해보겠습니다.
std::unique_ptr | std::shared_ptr | |
소유권 | 1개 | 여러개를 가질 수 있음. 정확히는 공유하는 방식 |
메모리해제 | 소유권이 1개인 만큼, 별도로 관리할 필요 없이, 자동으로 해제됨. | 여러개가 존재하기 때문에, 가장 마지막 객체가 사라질 때 비로소 해제됨. |
참조횟수 | 관리할 필요 없음. | 관리 대상. |
copy | 불가능 | 가능 |
move | 가능 | 가능 |
(4) c++ smart pointer 메모리 해제 (reset)
pointer 의 경우 delete 를 명시적으로 사용했어야 했습니다.
delete myPointer; // free memory
myPointer = NULL; // pointed dangling ptr to NULL
다만, smart pointer 는 아래와 같이 사용 할 수 있습니다.
auto my_type_obj = std::make_shared<MyType>(); // MyType class
...
my_type_obj.reset();
(5) 결론
c++ pointer 는 용도에 따라 사용되어야 합니다.
특히, c++ smart pointer 는 확실한 이해를 하고 사용하시면 좋을 거 같습니다.
같이 보면 좋을 컨텐츠 추천 드립니다.