BorrowCheck › Ядро языка Rust

Drop, RAII, порядок уничтожения

Трейт Drop, порядок уничтожения, флаги уничтожения, mem::forget и утечки, ManuallyDrop, dropck.

Тема объясняет трейт Drop и идиому RAII: ресурс освобождается деструктором, когда его владелец выходит из области видимости. Вопросы о трейте Drop проверяют, для каких типов его можно реализовать (E0120, E0367), почему в деструкторе нельзя переместить поле из self (E0507), как уничтожаются поля и объекты-трейты, что сообщает needs_drop и как страж срабатывает при раннем возврате. Раздел о порядке уничтожения разбирает поля, параметры функции, привязки шаблонов, элементы Vec, значения static, временные значения в scrutinee match и в хвостовом выражении блока, а также случаи, когда порядок не определён. Флаги уничтожения (drop flags) показывают, как компилятор отслеживает условную инициализацию, перемещение в ветвях и циклах и частичное перемещение; раздел о mem::forget, ManuallyDrop и Box::leak объясняет, почему утечка в Rust безопасна и что происходит с забытым Drain. Последний раздел посвящён проверке уничтожения (dropck): почему деструктор требует, чтобы заимствованные данные его пережили (E0597), почему исход решает порядок объявления и почему Vec<&T> проходит проверку благодаря #[may_dangle]. Тема опирается на владение и перемещение и подготавливает к небезопасному коду.

48 вопросов: базовый уровень — 21, средний — 22, углублённый — 5. 5 справок, 14 источников.

Разделы

  1. Трейт Drop и RAII
  2. Порядок уничтожения
  3. Флаги уничтожения (drop flags)
  4. mem::forget, утечки, ManuallyDrop
  5. Проверка уничтожения (dropck)

Предыдущая тема: Умные указатели, внутренняя изменяемость · Следующая тема: Многопоточность