Что такое владение

Главная идея Rust: у каждого значения есть ровно один владелец, и когда владелец уходит — память освобождается.

Владение (ownership) — набор правил, по которым Rust управляет памятью: у каждого значения один владелец, и память освобождается, когда владелец выходит из области видимости.

Проблема, которую решает владение

Любая программа должна где-то хранить данные и вовремя освобождать память. Есть два привычных подхода. Первый — ручное управление (C/C++): вы сами вызываете free. Забыли — утечка; освободили дважды или слишком рано — крах. Второй — сборщик мусора (Java, Go): за вас следит рантайм, но платите паузами и расходом ресурсов.

Rust выбрал третий путь: правила владения проверяются компилятором. Освобождение памяти вставляется автоматически в нужный момент, и при этом нет рантайм-сборщика.

Аналогия: одна-единственная книга

Представьте, что значение — это бумажная книга, существующая в единственном экземпляре. В любой момент времени книгой владеет ровно один человек. Когда владелец уходит из комнаты (переменная выходит из области видимости), книгу автоматически сдают в библиотеку — память освобождается. Невозможно, чтобы двое держали одну и ту же книгу и оба решили её выбросить (двойное освобождение). Невозможно, чтобы книгу выбросили, а кто-то продолжал её читать (висячий указатель). Это и есть владение.

Три правила владения

  1. У каждого значения в Rust есть владелец — переменная.
  2. В каждый момент владелец ровно один.
  3. Когда владелец выходит из области видимости, значение удаляется (память освобождается).

Область видимости и удаление

Область видимости — это блок { ... }, внутри которого переменная существует. На закрывающей скобке владелец «уходит из комнаты», и Rust автоматически вызывает специальный метод очистки.

fn main() {
    {
        let s = String::from("привет"); // s становится владельцем строки
        println!("внутри блока: {s}");
    } // <- здесь s выходит из области видимости, память строки освобождается

    // println!("{s}"); // ОШИБКА: s здесь уже не существует
}

Вывод:

внутри блока: привет

Стек и куча — зачем это важно

Простые значения фиксированного размера (числа, bool, char) живут на стеке — это быстро и дёшево. Данные неизвестного или меняющегося размера, например String, хранятся в куче: там выделяется память, а переменная держит указатель на неё. Именно за памятью в куче и нужно следить — владение определяет, кто отвечает за её освобождение.

В следующем уроке мы увидим, что происходит, когда такое «кучное» значение пытаются присвоить другой переменной — это ключевой момент, где Rust отличается от всех привычных языков.

Итог

  • Владение — способ управлять памятью без ручного free и без сборщика мусора.
  • У значения один владелец; когда он выходит из области видимости, память освобождается автоматически.
  • Следить нужно за данными в куче (например String); простые значения живут на стеке.
Проверьте себя
1. Сколько владельцев может быть у значения в Rust одновременно?
AСколько угодно
BНе больше двух
CРовно один
DЗависит от типа
2. Что происходит, когда владелец значения выходит из области видимости?
AНичего
BНужно вручную вызвать free
CЗапускается сборщик мусора
DЗначение удаляется и память освобождается автоматически
3. За памятью какого рода в первую очередь следит система владения?
AЗа данными в куче, например String
BЗа памятью на стеке для чисел
CЗа кодом программы
DЗа регистрами процессора