luke выходит из области видимости, что означает, что его члены, которыми он владеет, также исключаются. Так что Люк и Люк. Родитель, брось. Оба являются Rcs, поэтому счетчик ссылок для обеих областей памяти уменьшается до 1
Это шаг, где вы неправильно понимаете.
Не сбрасываются ли члены объекта при его отбрасывании?
Точно. Количество, которое уменьшается, напрямую связано с данными, которые указывает R c. Когда luke
выходит из области видимости, Rc
выходит из области видимости, и количество элементов, ссылающихся на RefCell
luke
, уменьшается, код ничего не знает о luke.parent
.
В Ваш код, после
luke.borrow_mut().parent = Some(anakin.clone());
anakin.borrow_mut().child = Some(luke.clone());
имеется 4 Rc
объектов (2 в стеке, 2 в куче) и 2 RefCell
объектов в куче с подсчетами, связанными с ними. Каждый RefCell
имеет счет 2
, как вы видели, потому что 2 Rc
s ссылаются на каждый RefCell
.
Когда anakin
падает, счет для его RefCell
уменьшается, поэтому у вас есть luke
RefCell
в куче со счетом 2
и anakin
RefCell
со счетом 1
.
Когда luke
падает затем уменьшается число , RefCell
, поэтому каждый из них теперь имеет счет 1
. В итоге в стеке не останется значений Rc
, которые ссылаются на RefCell
, но каждый RefCell
ссылается на other RefCell
, поэтому у Rust нет способа узнать, что они безопасны быть исключенным.
Не могу точно сказать по вашему вопросу, но это абсолютно ожидаемое ограничение типа Rc
при использовании с RefCell
, поскольку оно позволяет вводить циклы в собственность объекты.
Ваш код является почти минимальным воспроизводимым примером цикла R c: Что является минимальным примером цикла зависимости R c?