Модель володіння в 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 досягає того, що зазвичай забезпечує збирач сміття, але без його накладних витрат і без ризику подвійного звільнення пам’яті.


