더북(TheBook)

1.6.3 weak_ptr<T> 포인터

weak_ptr<T> 객체는 shared_ptr<T> 객체로만 생성할 수 있다. weak_ptr<T> 포인터는 자유 공간에 생성된 객체들의 인스턴스 주소를 클래스 멤버로 저장할 때 주로 사용된다. 같은 타입의 객체를 가리키는 용도로 shared_ptr<T> 멤버를 사용하면 특정 조건에서는 순환 참조가 발생할 수 있고, 순환 참조가 발생하면 자유 공간에서 해당 클래스 타입의 객체들을 삭제하지 못할 수 있다. 이게 일반적인 상황은 아니지만, 그림 1-4에 보인 것처럼 충분히 가능한 상황이다.

 

그림 1-4에서 배열에 있는 스마트 포인터 pA, pB, pC, pD를 모두 삭제하거나 nullptr로 초기화해도 스마트 포인터가 가리키는 객체 A, B, C, D의 메모리는 해제되지 않는다. 여전히 모든 객체의 주소를 담은 shared_ptr<X> 객체 하나가 남는다. 남은 객체 A, B, C, D에 접근할 수 있는 외부 포인터가 하나도 없으므로 남은 객체들을 삭제할 방법이 없다. 객체들이 다른 객체를 참조할 때 weak_ptr<X> 멤버를 사용했다면 이런 문제를 피할 수 있다. weak_ptr<X> 멤버를 사용하면 배열에 있는 외부 포인터들이 소멸되거나 초기화되었을 때 객체들이 소멸되는 것을 방해하지 않는다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.