Общий счет ссылок в Rust
Иногда одни и те же данные должны жить, пока на них смотрит хотя бы одно имя. Обычное владение передается целиком и оставляет одного владельца. Счет ссылок хранит число активных имен: каждое новое имя увеличивает счет, а исчезновение имени уменьшает его.
Когда счет доходит до нуля, значение в куче освобождается. Клон здесь не копирует данные, а добавляет еще одно имя на тот же блок памяти. Через функцию сильного счета можно посмотреть, сколько имен сейчас держат одну оболочку.
Поделим одну строку между двумя переменными:
use std::rc::Rc;
fn main() {
let a = Rc::new(String::from("team"));
let b = Rc::clone(&a);
println!("{} {}", Rc::strong_count(&a), a.len());
let _ = b;
}
После Rc::clone счет станет два,
хотя текст в куче один. Пока живут и
a, и b, строка не исчезает.
Внутри вложенного блока второе имя поднимает счет, а после конца блока счет снова падает:
use std::rc::Rc;
fn main() {
let first = Rc::new(10);
{
let second = Rc::clone(&first);
println!("count {}", Rc::strong_count(&first));
let _ = second;
}
println!("count {}", Rc::strong_count(&first));
}
Дано число:
3
Оберните литерал в счет ссылок, сделайте второе имя на те же данные и выведите сильный счет до и после того, как второе имя выйдет из области видимости.
Дана структура:
struct Team {
id: i32,
}
Создайте значение с id: 1 под
счетом, передайте копию имени в функцию,
которая печатает поле, и убедитесь, что
данные не копируются в куче.
Скажите, что произойдет с данными в куче, когда сильный счет станет нулем.