저번 시간에 공부했던 unique_ptr, shared_ptr에 이어서 오늘은 weak_ptr에 대하여 공부해 보도록 한다.
shared_ptr에서는 자신이 참조하고 있는 객체(메모리 주소)에 대해 reference counting을 함으로써, 객체의 수명에 직접적으로 관여한다. shared_ptr 객체 하나가 소멸되더라도, 동일한 메모리 주소를 참조하고 있는 다른 shared_ptr 객체가 있으면 참조하고 있던 메모리 주소의 객체는 소멸되지 않는다. - 저번 시간에 공부했던 순환참조의 내용이다.
이 순환참조를 해결하기 위해 나온 녀석이 weak_ptr이다.
weak_ptr은 하나 이상의 shared_ptr 인스턴스가 소유하는 객체에 대한 접근은 제공하지만, 소유자의 수에는 포함되지 않는 스마트포인터다.
무슨얘기냐?
기존의 shared_ptr은 복사/참조 할 경우 참조자의 갯수가 하나씩 늘어나게 되고, 모두 삭제될 경우 해제되는 방식이였다. 하지만, weak_ptr을 사용해 복사/참조 할 경우 참조자의 갯수가 늘어나지 않게 된다. 그러므로, 저 코드의 결과는 1이 나오게 된다.
weak_ptr을 이용하면 전에 봤던 순환참조의 고리에서 벗어날 수 있다.
이런식으로 shared_ptr 대신 weak_ptr을 사용하면 참조자의 갯수가 늘어나지 않기 때문에 정상적으로 메모리가 해제될 수 있다. 그러므로, 만약 shared_ptr<class>를 사용하고 싶은데, class내부에서 순환참조가 일어날 수 있는 경우에는 weak_ptr로 멤버변수를 만들어 주면 순환참조 문제를 손쉽게 해결할 수 있다.
'Modern C++' 카테고리의 다른 글
[C++] Container - List (0) | 2021.07.19 |
---|---|
[C++] Container - array, vector (0) | 2021.07.18 |
[C++] SmartPointer - shared_ptr (0) | 2021.07.11 |
[C++] SmartPointer - unique_ptr (0) | 2021.07.10 |
C++ 11 복습 계획 (0) | 2021.07.04 |