Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpSpRc 93 of 288 menu
◀ ▶

Общий счет ссылок в 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 под счетом, передайте копию имени в функцию, которая печатает поле, и убедитесь, что данные не копируются в куче.

Скажите, что произойдет с данными в куче, когда сильный счет станет нулем.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить