Rc / Weak

부모는 자식을 소유하고, 자식은 부모를 약하게 가리킨다

Rc<T>는 strong count가 0이 되어야 값을 해제한다. 양방향을 모두 strong으로 잡으면 서로를 살려 두는 순환 참조가 생긴다.

트리 소유권 규칙

소유권은 아래로 `Rc`, 탐색용 역참조는 위로 `Weak`를 사용한다.

문제: 양쪽 모두 strong

cycle leak
branch

children: Vec<Rc<Node>>

leaf

parent: Rc<Node>라면 부모도 소유

branch

leaf.parent 때문에 strong이 남음

leaf

branch.children 때문에 strong이 남음

drop

둘 다 0이 되지 않아 해제 불가

해결: 부모 방향은 weak

cycle safe
branch

자식을 `Rc`로 소유하고 수명을 결정

leaf

parent: RefCell<Weak<Node>>

downgrade

strong이 아니라 weak count만 증가

upgrade

살아 있을 때만 `Some(Rc)` 반환

scope 종료

strong 0이면 weak가 있어도 해제