Гайды

Rust: владение и безопасность памяти

Ownership и move, заимствование, lifetimes, Option и Result, interior mutability и clippy.

~10 мин чтения

Rust: владение и безопасность памяти

Rust гарантирует безопасность памяти без GC в runtime: владение (ownership), заимствование (&, &mut), время жизни ('a). Ошибки многих классов — на этапе компиляции. Wasm — Rust и WebAssembly.


1. Ownership

Каждое значение имеет одного владельца; при присвоении владение перемещается (move), если тип не Copy.

Стек и куча: мелкие фиксированные данные (i32, ссылки) живут на стеке; String, Vec<T> владеют буфером в куче. &str — заимствованный срез по UTF-8 байтам (часто на существующий String или литерал).

rust
let owned: String = "hello".to_string();
let borrowed: &str = &owned; // заимствование
// owned нельзя переместить, пока живёт borrowed

2. Заимствование

  • &T — неизменяемая ссылка, много читателей.
  • &mut T — ровно один активный писатель, нет алиасинга с мутацией.

3. Время жизни

Явные 'a связывают ссылки с областью, чтобы не было dangling references.


4. Result и Option

Нет null; отсутствие значения — Option<T>, ошибки — Result<T, E> с ?.


5. Когда компилятор «борется»

Interior mutability (RefCell, Mutex) — осознанный выход из статических правил с проверками в runtime.


6. Типичные ошибки компилятора

E0382 (use after move) — клонируйте (clone, Copy) или заимствуйте. E0499 (две мутабельные ссылки) — разбейте блоки, используйте split_at_mut для слайсов или рефакторинг. E0597 (borrow lives too long) — сократите область ссылки или добавьте явные lifetimes / структуру-владельца.


7. Drop и RAII

Деструктор Drop вызывается при выходе из области; порядок с std::mem::drop и циклами владения важен для файловых дескрипторов и блокировок. Избегайте циклических Rc без Weak.


8. Чек-лист

  • cargo clippy и fmt в CI.
  • Читать сообщения компилятора — они подсказывают фиксы.
  • Не злоупотреблять unsafe без аудита.
  • cargo audit / Dependabot для зависимостей.
  • Документировать инварианты для unsafe блоков в коде.

Дальше: тег Rust