Функция drop
Функция drop из модуля std::mem позволяет
принудительно уничтожить значение и освободить связанные
с ним ресурсы до выхода из области видимости. Параметром
функция принимает значение, которое необходимо уничтожить.
После вызова drop значение становится недоступным
для дальнейшего использования.
Функция drop особенно полезна, когда нужно освободить
ресурсы (например, файловые дескрипторы, мьютексы или
выделенную память) раньше, чем значение выйдет из области
видимости естественным образом. Она работает с типами,
реализующими трейт Drop.
Синтаксис
std::mem::drop(value)
Функцию drop также можно вызвать через импорт
use std::mem::drop; и использовать просто как
drop(value).
Пример
Давайте создадим значение, а затем принудительно уничтожим
его с помощью функции drop. После этого значение
больше нельзя будет использовать:
fn main()
{
let s = String::from("abcde");
println!("Before drop: {}", s);
drop(s);
// println!("{}", s); // ошибка: use of moved value
}
Результат выполнения кода:
Before drop: abcde
Пример
Давайте посмотрим, как функция drop освобождает
мьютекс раньше окончания области видимости, позволяя
другому потоку захватить блокировку:
use std::sync::Mutex;
fn main()
{
let m = Mutex::new(5);
{
let mut num = m.lock().unwrap();
*num = 10;
println!("Locked value: {}", *num);
drop(num);
println!("Lock released");
}
println!("Mutex: {:?}", m);
}
Результат выполнения кода:
Locked value: 10
Lock released
Mutex: Mutex { data: 10, poisoned: false, .. }
Пример
Давайте убедимся, что функция drop действительно
вызывает деструктор. Для этого создадим тип, который
выводит сообщение при уничтожении:
struct Resource
{
name: String,
}
impl Drop for Resource
{
fn drop(&mut self)
{
println!("Dropping: {}", self.name);
}
}
fn main()
{
let r = Resource { name: String::from("abcde") };
println!("Before drop");
drop(r);
println!("After drop");
}
Результат выполнения кода:
Before drop
Dropping: abcde
After drop