Ý tưởng cơ bản của việc quản lý tài nguyên (bao gồm cả bộ nhớ) trong một chương trình, bất kể chiến lược nào, là các tài nguyên gắn với "đối tượng" không thể truy cập có thể được lấy lại. Ngoài bộ nhớ, những tài nguyên đó có thể là khóa mutex, xử lý tệp, ổ cắm, kết nối cơ sở dữ liệu ...
Các ngôn ngữ có bộ thu gom rác định kỳ quét bộ nhớ (cách này hay cách khác) để tìm các đối tượng không sử dụng, giải phóng tài nguyên liên quan đến chúng và cuối cùng giải phóng bộ nhớ được sử dụng bởi các đối tượng đó.
Rust không có GC, nó quản lý như thế nào?
Rust có quyền sở hữu. Sử dụng hệ thống kiểu affine , nó theo dõi biến nào vẫn đang giữ một đối tượng và khi một biến như vậy vượt ra khỏi phạm vi, nó sẽ gọi hàm hủy của nó. Bạn có thể thấy hệ thống kiểu affine có hiệu lực khá dễ dàng:
fn main() {
let s: String = "Hello, World!".into();
let t = s;
println!("{}", s);
}
Sản lượng:
<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;
^
minh họa hoàn hảo rằng tại bất kỳ thời điểm nào, ở cấp độ ngôn ngữ, quyền sở hữu được theo dõi.
Quyền sở hữu này hoạt động theo cách đệ quy: nếu bạn có Vec<String>
(tức là một mảng động gồm các chuỗi), thì mỗi chuỗi String
thuộc quyền sở hữu của Vec
chính nó thuộc sở hữu của một biến hoặc một đối tượng khác, v.v. do đó, khi một biến vượt ra ngoài phạm vi, nó giải phóng một cách đệ quy tất cả tài nguyên mà nó nắm giữ, thậm chí gián tiếp. Trong trường hợp Vec<String>
này có nghĩa là:
- Giải phóng bộ đệm bộ nhớ liên quan đến từng
String
- Giải phóng bộ đệm bộ nhớ được liên kết với
Vec
chính nó
Do đó, nhờ theo dõi quyền sở hữu, vòng đời của TẤT CẢ các đối tượng chương trình được ràng buộc chặt chẽ với một (hoặc một số) biến hàm, cuối cùng sẽ vượt ra khỏi phạm vi (khi khối mà chúng thuộc về kết thúc).
Lưu ý: điều này hơi lạc quan, sử dụng phép đếm tham chiếu ( Rc
hoặc Arc
) có thể tạo thành các chu trình tham chiếu và do đó gây ra rò rỉ bộ nhớ, trong trường hợp đó, các tài nguyên gắn với chu trình có thể không bao giờ được giải phóng.