Класс 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,
который возвращает текущее количество сильных ссылок