Гайды
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 или литерал).
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