C++11 스마트 포인터 배우는 중인데 unique_ptr, shared_ptr, weak_ptr 이렇게 셋이 있으니까 언제 뭘 골라야 하는지 판단이 안 서요. 솔직히 그냥 다 shared_ptr로 통일하면 편할 것 같은데 왜 나눠놓은 건지 궁금합니다.


제 나름대로 이해한 건 unique_ptr는 혼자만 소유하는 거고 shared_ptr는 여러 명이 나눠 갖는 거라던데, 그럼 그냥 다 나눠 가지면 되는 거 아닌가 싶은 거죠. 성능 차이가 그렇게 큰가요?


그리고 weak_ptr는 진짜 언제 쓰는 건지 하나도 모르겠어요. 소유를 안 한다는데 그럼 이걸 왜 씁니까? 예제 코드 보면 이런 게 있던데요.


struct Node {
  std::shared_ptr<Node> next;
  std::shared_ptr<Node> prev;
};

auto a = std::make_shared<Node>();
auto b = std::make_shared<Node>();
a->next = b;
b->prev = a;


이렇게 서로 가리키게 하면 메모리 누수가 난다고 하던데, 여기서 prev를 weak_ptr로 바꾸면 해결된다는 게 무슨 소리인지 이해가 안 가요. 둘 다 shared인데 왜 안 지워지는 거죠? 참조 카운트라는 게 여기서 어떻게 돌아가는 건가요.


결국 정리하면 세 개를 각각 어떤 상황에서 골라 쓰는 게 맞는지, 그리고 shared_ptr만 남발하면 뭐가 문제인지 초보도 알아듣게 설명해 주시면 좋겠어요.