hyperion/20-dev/00-rust/smart pointers/drop.md
2025-11-27 23:37:40 +03:00

3.9 KiB
Raw Permalink Blame History

Вот краткая выжимка о трейте Drop на основе предоставленного материала.

1. Суть трейта Drop

Трейт Drop используется для настройки кода, который автоматически выполняется, когда значение выходит из области видимости (scope).

  • Основная цель: Очистка ресурсов (освобождение памяти в куче, закрытие файлов, сетевых соединений, снятие блокировок).
  • Это аналог деструктора в ООП языках.
  • В Rust почти все умные указатели (например, Box<T>) используют Drop для корректного освобождения памяти.

2. Как реализовать

Нужно реализовать единственный метод drop, который принимает мутабельную ссылку на self.

struct CustomSmartPointer {
    data: String,
}

impl Drop for CustomSmartPointer {
    fn drop(&mut self) {
        // Ваш код очистки.
        // В примере: просто выводим сообщение.
        println!("Dropping CustomSmartPointer with data `{}`!", self.data);
    }
}
  • Автоматический вызов: Вам не нужно вызывать этот метод вручную. Rust сам вставит вызов в нужном месте (обычно в конце блока {}).
  • Порядок: Переменные удаляются в порядке, обратном их созданию (LIFO - Last In, First Out).

3. Ручная очистка (Early Drop)

Иногда нужно освободить ресурс раньше, чем закончится область видимости (например, чтобы раньше снять блокировку Mutex или закрыть файл).

  • Проблема: Rust запрещает вызывать метод .drop() вручную (ошибка компиляции explicit destructor calls not allowed), чтобы избежать двойной очистки (double free error).
  • Решение: Используйте функцию std::mem::drop(value). Она принимает значение по значению (забирает владение) и тут же выбрасывает его, вызывая деструктор.
fn main() {
    let c = CustomSmartPointer { data: String::from("some data") };
    println!("Created.");
    
    // c.drop(); // ОШИБКА! Нельзя вызывать метод трейта напрямую.
    
    drop(c); // Правильно. Явный вызов функции из std::mem.
    // Деструктор отработает здесь.
    
    println!("End of main.");
}

Итог одной строкой

Drop позволяет написать код, который выполнится автоматически при уничтожении объекта, а если нужно уничтожить объект досрочно — используйте функцию std::mem::drop.

1 2 3 4 5 6 7 8 9