부모는 자식을 소유하고, 자식은 부모를 약하게 가리킨다
Rc<T>는 strong count가 0이 되어야 값을 해제한다.
양방향을 모두 strong으로 잡으면 서로를 살려 두는 순환 참조가 생긴다.
트리 소유권 규칙
소유권은 아래로 `Rc`, 탐색용 역참조는 위로 `Weak`를 사용한다.
문제: 양쪽 모두 strong
cycle leak
branch
children: Vec<Rc<Node>>
strong
leaf
parent: Rc<Node>라면 부모도 소유
branch
leaf.parent 때문에 strong이 남음
leaf
branch.children 때문에 strong이 남음
drop
둘 다 0이 되지 않아 해제 불가
해결: 부모 방향은 weak
cycle safe
branch
자식을 `Rc`로 소유하고 수명을 결정
strong down
weak up
weak up
leaf
parent: RefCell<Weak<Node>>
downgrade
strong이 아니라 weak count만 증가
upgrade
살아 있을 때만 `Some(Rc)` 반환
scope 종료
strong 0이면 weak가 있어도 해제