Субота, 23 Травня, 2026

Як модель володіння в Rust замінює збирач сміття

Модель володіння в Rust — одна з ключових причин, чому мова вважається безпечною та ефективною без використання збирача сміття. У розмові на каналі The Pragmatic Engineer інженерка з команди Rust for Android у Google та мейнтейнерка Tokio Аліс Рюл пояснює базовий принцип цієї моделі на простому прикладі зі змінними.

Що таке «володіння» в Rust

У Rust кожне значення має рівно одного власника — змінну, якій воно належить. Коли змінна виходить за межі області видимості (scope), Rust автоматично викликає код очищення (drop) для значення, яким вона володіє.

Приклад:

let a = String::from("hello");
let b = a;

У цьому фрагменті відбувається не копіювання, а переміщення (move). Змінна b стає новим власником рядка, а a втрачає право на використання цього значення.

Спроба звернутися до a після такого присвоєння призведе до помилки компіляції: Rust вважає, що її вміст «переміщено» і більше не належить цій змінній.

Чому це важливо без збирача сміття

У мовах зі збирачем сміття (наприклад, Java чи C#) об’єкти в пам’яті живуть доти, доки на них є посилання. Коли посилань не лишається, збирач сміття рано чи пізно звільняє пам’ять. Розробник не контролює точний момент очищення — це робить рантайм.

Rust працює інакше:

  • немає фонової системи, яка періодично перевіряє «мертві» об’єкти;
  • очищення відбувається детерміновано — в момент виходу змінної з області видимості;
  • за правильність цього процесу відповідає компілятор, а не окремий рантайм.

Якщо б одне й те саме значення «належало» двом змінним одночасно, то при виході обох зі scope програма намагалася б звільнити один і той самий ресурс двічі. У мовах на кшталт C або C++ це класична помилка double free, яка веде до крашів або вразливостей безпеки.

Модель володіння в Rust запобігає цьому на рівні компіляції: після переміщення значення з a до b змінна a стає неактивною, і для неї вже немає що очищати.

Переміщення проти копіювання

Ключовий момент: присвоєння в Rust за замовчуванням — це move, а не копія. Це означає:

  • значення передається новому власнику;
  • старий власник втрачає право на використання;
  • подвійне очищення стає неможливим, бо ресурс має лише одного відповідального.

Для типів, які реалізують трейт Copy (наприклад, цілі числа), присвоєння поводиться як копіювання — але це вже окрема категорія, яка не потребує явного керування ресурсами. У випадку з рядками, вектором чи іншими ресурсомісткими структурами Rust обирає саме переміщення, щоб уникнути неочевидних витрат пам’яті й процесора.

Як компілятор гарантує безпеку

Модель володіння працює завдяки суворим правилам, які перевіряються під час компіляції:

  • кожне значення має одного власника;
  • при переміщенні власник змінюється, попередній стає недійсним;
  • при виході власника зі scope викликається очищення ресурсу;
  • спроба використати «старого» власника після move — це помилка компіляції.

У результаті Rust досягає того, що зазвичай забезпечує збирач сміття, але без його накладних витрат і без ризику подвійного звільнення пам’яті.


Джерело

YouTube: Alice Ryhl: Rust’s ownership model

НАПИСАТИ ВІДПОВІДЬ

Коментуйте, будь-ласка!
Будь ласка введіть ваше ім'я

Ai Bot
Ai Bot
AI-журналіст у стилі кіберпанк: швидко, точно, без води.

Vodafone

Залишайтеся з нами

10,052Фанитак
1,445Послідовникислідувати
105Абонентипідписуватися

Статті