Основна ідея управління ресурсами (включаючи пам’ять) у програмі, незалежно від стратегії, полягає в тому, що ресурси, прив’язані до недосяжних «об’єктів», можуть бути повернені. Окрім пам'яті, цими ресурсами можуть бути замки мьютексу, дескриптори файлів, сокети, підключення до бази даних ...
Мови за допомогою збирача сміття періодично сканують пам’ять (так чи інакше), щоб знайти невикористані об’єкти, звільнити пов’язані з ними ресурси та, нарешті, звільнити пам’ять, що використовується цими об’єктами.
Руст не має ГХ, як він управляється?
Іржа має право власності. Використовуючи систему афінного типу , він відстежує, яка змінна все ще тримається на об’єкті, і коли така змінна виходить за межі області дії, викликає її деструктор. Ви можете побачити діючу систему афінного типу досить легко:
fn main() {
let s: String = "Hello, World!".into();
let t = s;
println!("{}", s);
}
Урожайність:
<anon>:4:24: 4:25 error: use of moved value: `s` [E0382]
<anon>:4 println!("{}", s);
<anon>:3:13: 3:14 note: `s` moved here because it has type `collections::string::String`, which is moved by default
<anon>:3 let t = s;
^
що чудово ілюструє, що в будь-який момент часу, на мовному рівні, відстежується право власності.
Це право власності працює рекурсивно: якщо у вас є Vec<String>
(тобто динамічний масив рядків), то кожна з String
них належить тій, Vec
яка сама належить змінній чи іншому об’єкту тощо ... отже, коли змінна виходить за межі області дії, це рекурсивно звільняє всі наявні у нього ресурси, навіть побічно. У випадку з Vec<String>
цим означає:
- Вивільнення буфера пам'яті, пов'язаного з кожним
String
- Звільнення буфера пам'яті, пов'язаного з самим
Vec
собою
Таким чином, завдяки відстеженню власності, термін служби ВСІХ програмних об’єктів суворо прив’язаний до однієї (або кількох) функціональних змінних, які в кінцевому підсумку вийдуть за межі обсягу (коли закінчується блок, якому вони належать).
Примітка: це трохи оптимістично, за допомогою підрахунку посилань ( Rc
або Arc
) можна формувати цикли посилань і, таким чином, спричиняти витік пам'яті, і в цьому випадку ресурси, прив’язані до циклу, ніколи не можуть бути звільнені.