[C++] 유니크(Unique) 포인터
카테고리: Cpp
이 글은 C++ 유니크(Unique) 포인터를 공부하고 정리한 글입니다.
유니크 포인터는 소유자가 하나밖에 없는 포인터이다.
유니크(Unique) 포인터
- 포인터를 단독으로 소유
- 소유한 포인터를 누구하고도 공유하지 않음
- 따라서 복사나 대입 불가
-
unique_ptr
가 범위를 벗어날 때, 포인터가 지워짐(delete)코드 예제
#include <memory> int main() { std::unique_ptr<int[]> myArray1(new int[](40)); // C++11 std::unique_ptr<int[]> myArray2 = std::make_unique<int[]>(40); // C++14 이후 }
reset()
- 포인터를 교체한다
std::unique_ptr
가 재설정될 때, 소유하고 있던 원시 포인터는 자동으로 소멸됨
std::unique_ptr<Vector> vector = std::make_unique<Vector>(10.f, 30.f); vector.reset(new Vector(20.f, 40.f)); // 기존에 가지고 있던 포인터를 해제하고 새로운 포인터를 연결해준다 vector.reset(); // 가지고 있던 포인터를 해제한다 vector = nullptr; // 가지고 있던 포인터를 해제한다
get()
- 포인터를 반환한다
- 다만, 포인터에 대한 소유권을 박탈하는 것은 아니다
std::unique_ptr<Vector> vector = std::make_unique<Vector>(10.f, 30.f); Vector* ptr = vector.get(); // 10.f 30.f
release()
- 포인터에 대한 소유권을 박탈하고 포인터를 반환한다
release()
호출 후get()
을 호출하면nullptr
가 반환됨
std::unique_ptr<Vector> vector = std::make_unique<Vector>(10.f, 30.f); Vector* ptr1 = vector.release(); // 10.f 30.f Vector* ptr2 = vector.get(); // nullptr
소유권 이전하기
std::unique_ptr
는 소유한 포인터를 아무하고도 공유하지 않음- 즉, 주소 복사를 하지 않는다는 뜻
- 대신, 소유권을 다른
std::unique_ptr
로 옮길 수 있음 - 예외 :
const std::unique_ptr
std::vector<std::unique_ptr<Player>> players; std::unique_ptr<Player> coco = std::make_unique<Player>("Coco"); players.push_back(std::move(coco)); std::unique_ptr<Player> lulu = std::make_unique<Player>("Lulu"); players.push_back(std::move(lulu));
move()
- 개체 A의 모든 멤버를 포기하고 그 소유권을 B에게 주는 방법
- 메모리 할당과 해제가 일어나지 않음
관련 글 보러가기
적합한 경우
- 클래스에서 생성자/소멸자
unique_ptr
을 사용 할 경우 소멸자에서 delete를 할 필요가 없어진다
- 지역 변수에서 동적 할당할 때
- 실수나 return으로 인해 delete를 못할 때 알아서 메모리 해제(delete)를 해준다
- STL 벡터에 포인터 저장할 때
myVector.clear()
할 시 안에 있는 메모리들을unique_ptr
이 해제해준다
참조
💻 열심히 공부해서 작성 중이니 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 알려주시면 감사하겠습니다! 😸
댓글 남기기