weak_ptr

shared_ptr끼리 서로 붙잡으면 객체가 죽지 않는다

순환 참조에서는 참조 횟수가 0이 되지 않습니다. 한쪽을 weak_ptr로 바꾸면 소유권 카운트를 올리지 않아 소멸이 가능해집니다.

문제: shared ↔ shared

A

B를 shared_ptr로 소유

B

A를 shared_ptr로 소유

결과

서로 count를 올려 소멸되지 않음

해결: shared → weak

A

B를 shared_ptr로 소유

B

A를 weak_ptr로 관찰

결과

count가 0이 되면 정상 소멸

weak_ptr는 객체를 쓰기 전 lock()으로 shared_ptr를 얻고, 실패하면 이미 사라진 객체로 봅니다.