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

Главная идея 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Значение удаляется и память освобождается автоматически
CНужно вручную вызвать free
DЗапускается сборщик мусора
3. За памятью какого рода в первую очередь следит система владения?
AЗа памятью на стеке для чисел
BЗа данными в куче, например String
CЗа кодом программы
DЗа регистрами процессора
Поддержать проект