Rc cycle

서로를 소유한 Rc는 스코프가 끝나도 0이 되지 않는다

예제 14-26에서 a.tail()b로 바꾸면 ab가 서로의 강한 참조를 붙잡는 고리가 만들어집니다.

예제 14-26의 고리

main 끝에서 카운트가 줄어드는 모습

before drop

a = 2, b = 2

서로의 tail이 강한 참조를 하나씩 보관합니다.

drop b

b 카운트 2에서 1

a가 여전히 b를 가리켜 힙 값은 남습니다.

drop a

a 카운트 2에서 1

b가 여전히 a를 가리켜 둘 다 해제되지 않습니다.

왜 러스트가 막지 않나

이 문제는 메모리 안전성 위반이 아니라 프로그램 구조의 논리 버그입니다. 그래서 테스트와 코드 리뷰로 소유 관계를 점검하고, 소유하지 않는 역방향 링크에는 Weak<T>를 사용해야 합니다.