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

Функция 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

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

  • трейт Drop,
    который определяет поведение при уничтожении значения
  • концепция ownership,
    которая описывает владение значениями в Rust
  • операция move,
    которая перемещает владение значением
  • трейт Copy,
    который позволяет копировать значения вместо перемещения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить