Что такое владение
Главная идея Rust: у каждого значения есть ровно один владелец, и когда владелец уходит — память освобождается.
Владение (ownership) — набор правил, по которым Rust управляет памятью: у каждого значения один владелец, и память освобождается, когда владелец выходит из области видимости.
Проблема, которую решает владение
Любая программа должна где-то хранить данные и вовремя освобождать память. Есть два привычных подхода. Первый — ручное управление (C/C++): вы сами вызываете free. Забыли — утечка; освободили дважды или слишком рано — крах. Второй — сборщик мусора (Java, Go): за вас следит рантайм, но платите паузами и расходом ресурсов.
Rust выбрал третий путь: правила владения проверяются компилятором. Освобождение памяти вставляется автоматически в нужный момент, и при этом нет рантайм-сборщика.
Аналогия: одна-единственная книга
Представьте, что значение — это бумажная книга, существующая в единственном экземпляре. В любой момент времени книгой владеет ровно один человек. Когда владелец уходит из комнаты (переменная выходит из области видимости), книгу автоматически сдают в библиотеку — память освобождается. Невозможно, чтобы двое держали одну и ту же книгу и оба решили её выбросить (двойное освобождение). Невозможно, чтобы книгу выбросили, а кто-то продолжал её читать (висячий указатель). Это и есть владение.
Три правила владения
- У каждого значения в Rust есть владелец — переменная.
- В каждый момент владелец ровно один.
- Когда владелец выходит из области видимости, значение удаляется (память освобождается).
Область видимости и удаление
Область видимости — это блок { ... }, внутри которого переменная существует. На закрывающей скобке владелец «уходит из комнаты», и Rust автоматически вызывает специальный метод очистки.
fn main() {
{
let s = String::from("привет"); // s становится владельцем строки
println!("внутри блока: {s}");
} // <- здесь s выходит из области видимости, память строки освобождается
// println!("{s}"); // ОШИБКА: s здесь уже не существует
}Вывод:
внутри блока: привет
Стек и куча — зачем это важно
Простые значения фиксированного размера (числа, bool, char) живут на стеке — это быстро и дёшево. Данные неизвестного или меняющегося размера, например String, хранятся в куче: там выделяется память, а переменная держит указатель на неё. Именно за памятью в куче и нужно следить — владение определяет, кто отвечает за её освобождение.
В следующем уроке мы увидим, что происходит, когда такое «кучное» значение пытаются присвоить другой переменной — это ключевой момент, где Rust отличается от всех привычных языков.
Итог
- Владение — способ управлять памятью без ручного
freeи без сборщика мусора. - У значения один владелец; когда он выходит из области видимости, память освобождается автоматически.
- Следить нужно за данными в куче (например
String); простые значения живут на стеке.