Класс Weak
Класс Weak из модуля std::sync представляет собой
слабую ссылку на данные, которые управляются умным указателем
Arc. В отличие от Arc, слабая ссылка не
увеличивает счетчик сильных ссылок и не препятствует
освобождению памяти. Это позволяет избежать циклических
зависимостей, которые приводили бы к утечкам памяти.
Слабая ссылка создается методом downgrade у экземпляра
Arc. Чтобы получить доступ к данным через Weak,
необходимо вызвать метод upgrade, который возвращает
Option<Arc<T>>. Если все сильные ссылки уже уничтожены,
метод вернет None.
Синтаксис
use std::sync::{Arc, Weak};
let arc: Arc<T> = Arc::new(value);
let weak: Weak<T> = Arc::downgrade(&arc);
Пример
Давайте создадим сильную ссылку Arc и получим из нее
слабую ссылку Weak, а затем попробуем получить доступ
к данным через метод upgrade:
use std::sync::{Arc, Weak};
fn main()
{
let arc = Arc::new(12345);
let weak: Weak<i32> = Arc::downgrade(&arc);
match weak.upgrade()
{
Some(value) => println!("{}", value),
None => println!("value has been dropped"),
}
}
Результат выполнения кода:
12345
Пример
Давайте убедимся, что после уничтожения сильной ссылки
метод upgrade возвращает None:
use std::sync::{Arc, Weak};
fn main()
{
let arc = Arc::new("abcde");
let weak: Weak<&str> = Arc::downgrade(&arc);
drop(arc);
match weak.upgrade()
{
Some(value) => println!("{}", value),
None => println!("value has been dropped"),
}
}
Результат выполнения кода:
value has been dropped