РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
847 of 1245 menu

Класс Rc

Класс Rc (Reference Counted) - это умный указатель, который позволяет нескольким частям программы совместно владеть одними и теми же данными. Rc отслеживает количество ссылок на данные и автоматически освобождает память, когда последняя ссылка выходит из области видимости. Класс доступен из модуля std::rc. Данные внутри Rc доступны только для чтения, поскольку Rc не гарантирует потокобезопасность и не реализует типаж Send.

Синтаксис

use std::rc::Rc; let res = Rc::new(value);

Пример

Давайте создадим умный указатель Rc на число 5 и выведем его значение:

use std::rc::Rc; fn main() { let res = Rc::new(5); println!("{}", res); }

Результат выполнения кода:

5

Пример

Давайте создадим Rc и клонируем его, чтобы получить несколько владельцев одних данных:

use std::rc::Rc; fn main() { let a = Rc::new(5); let b = Rc::clone(&a); let c = Rc::clone(&a); println!("{}", Rc::strong_count(&a)); }

Результат выполнения кода:

3

Пример

Давайте создадим общие данные через Rc для строки "abcde" и выведем их через клонированные указатели:

use std::rc::Rc; fn main() { let a = Rc::new(String::from("abcde")); let b = Rc::clone(&a); println!("{}", a); println!("{}", b); }

Результат выполнения кода:

"abcde" "abcde"

Пример

Давайте проверим, что после удаления одного клона счётчик ссылок уменьшается:

use std::rc::Rc; fn main() { let a = Rc::new(5); let b = Rc::clone(&a); println!("{}", Rc::strong_count(&a)); drop(b); println!("{}", Rc::strong_count(&a)); }

Результат выполнения кода:

2 1

Смотрите также

  • класс Rc,
    который представляет умный указатель с подсчётом ссылок
  • метод new,
    который создаёт новый умный указатель Rc
  • метод clone,
    который увеличивает счётчик ссылок и возвращает новый указатель
  • метод strong_count,
    который возвращает текущее количество сильных ссылок
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить