Cons(5, ...)
처음에는 Nil을 가리키지만, 이후
borrow_mut로 b를 가리키게 됩니다.
Rc는 스코프가 끝나도 0이 되지 않는다
예제 14-26에서 a.tail()을 b로 바꾸면
a와 b가 서로의 강한 참조를 붙잡는 고리가
만들어집니다.
Cons(5, ...)
처음에는 Nil을 가리키지만, 이후
borrow_mut로 b를 가리키게 됩니다.
Cons(10, Rc::clone(&a))
생성될 때부터 a를 강한 참조로 소유해
a의 카운트를 올립니다.
Rc::clone(&b) 저장
a도 b를 강한 참조로 붙잡아 양쪽 카운트가
모두 2가 됩니다.
Weak부모를 관찰해야 하는 자식 링크처럼 해제를 막으면 안 되는 참조는 약한 참조로 둡니다.
main 끝에서 카운트가 줄어드는 모습a = 2, b = 2서로의 tail이 강한 참조를 하나씩 보관합니다.
b 카운트 2에서 1a가 여전히 b를 가리켜 힙 값은 남습니다.
a 카운트 2에서 1b가 여전히 a를 가리켜 둘 다 해제되지 않습니다.
이 문제는 메모리 안전성 위반이 아니라 프로그램 구조의 논리 버그입니다.
그래서 테스트와 코드 리뷰로 소유 관계를 점검하고, 소유하지 않는 역방향
링크에는 Weak<T>를 사용해야 합니다.