Bộ nhớ (và khóa tài nguyên) được trả về HĐH tại các điểm xác định trong quá trình thực thi chương trình. Luồng điều khiển của một chương trình tự nó đủ để biết nơi nào, chắc chắn, một tài nguyên nhất định có thể được giải quyết. Cũng giống như cách một lập trình viên con người biết viết ở đâu fclose(file)
khi chương trình được thực hiện với nó.
Các GC giải quyết điều này bằng cách tìm ra nó trực tiếp trong thời gian chạy khi luồng điều khiển được thực thi. Nhưng nguồn thực sự của dòng điều khiển là nguồn. Vì vậy, về mặt lý thuyết, có thể xác định vị trí chèn các free()
cuộc gọi trước khi biên dịch bằng cách phân tích nguồn (hoặc AST).
Đếm tham chiếu là một cách rõ ràng để thực hiện điều này, nhưng thật dễ dàng gặp phải tình huống trong đó con trỏ vẫn được tham chiếu (vẫn trong phạm vi) nhưng không còn cần thiết nữa. Điều này chỉ chuyển đổi trách nhiệm giải quyết thủ công các con trỏ thành trách nhiệm quản lý thủ công phạm vi / tham chiếu đến các con trỏ đó.
Có vẻ như có thể viết một chương trình có thể đọc nguồn của chương trình và:
- dự đoán tất cả các hoán vị của luồng điều khiển của chương trình --- với độ chính xác tương tự như khi xem chương trình thực thi trực tiếp của chương trình
- theo dõi tất cả các tài liệu tham khảo đến các tài nguyên được phân bổ
- đối với mỗi tham chiếu, đi qua toàn bộ luồng điều khiển tiếp theo để tìm điểm sớm nhất mà tham chiếu được đảm bảo không bao giờ bị hủy bỏ
- tại thời điểm đó, chèn một câu lệnh thỏa thuận vào dòng mã nguồn đó
Có bất cứ điều gì ngoài đó đã làm điều này? Tôi không nghĩ rằng con trỏ thông minh Rust hoặc C ++ / RAII là như nhau.