Hãy bắt đầu bằng cách quy định rằng bộ nhớ là phổ biến (hàng chục, hàng trăm hoặc thậm chí hàng nghìn lần) phổ biến hơn tất cả các tài nguyên khác cộng lại. Mỗi biến, đối tượng, thành viên đối tượng cần một số bộ nhớ được cấp phát cho nó và giải phóng sau này. Đối với mỗi tệp bạn mở, bạn tạo hàng chục đến hàng triệu đối tượng để lưu trữ dữ liệu được rút ra khỏi tệp. Mỗi luồng TCP đi cùng với một số chuỗi byte tạm thời không giới hạn được tạo để ghi vào luồng. Có phải chúng ta trên cùng một trang ở đây? Tuyệt quá.
Để RAII hoạt động (ngay cả khi bạn có con trỏ thông minh đã sẵn sàng cho mọi trường hợp sử dụng dưới ánh mặt trời), bạn cần có quyền sở hữu . Bạn cần phân tích ai nên sở hữu đối tượng này hoặc đối tượng đó, ai không nên và khi nào nên chuyển quyền sở hữu từ A sang B. Chắc chắn, bạn có thể sử dụng quyền sở hữu chung cho mọi thứ , nhưng sau đó bạn sẽ mô phỏng một GC thông qua con trỏ thông minh. Tại thời điểm đó , việc xây dựng GC thành ngôn ngữ trở nên dễ dàng và nhanh chóng hơn nhiều .
Bộ sưu tập rác giải phóng bạn khỏi mối quan tâm này đối với tài nguyên, bộ nhớ được sử dụng phổ biến nhất. Chắc chắn, bạn vẫn cần đưa ra quyết định tương tự cho các tài nguyên khác, nhưng những tài nguyên đó ít phổ biến hơn (xem ở trên) và quyền sở hữu phức tạp (ví dụ như được chia sẻ) cũng ít phổ biến hơn. Gánh nặng tinh thần giảm đáng kể.
Bây giờ, bạn đặt tên cho một số nhược điểm để làm cho tất cả các giá trị rác được thu thập. Tuy nhiên, việc tích hợp cả hai loại giá trị và an toàn bộ nhớ với RAII vào một ngôn ngữ là vô cùng khó khăn, vì vậy có lẽ tốt hơn là nên số hóa các giao dịch này thông qua các phương tiện khác?
Sự mất đi tính quyết định hóa ra không phải là xấu trong thực tế, bởi vì nó chỉ ảnh hưởng đến tuổi thọ của đối tượng xác định . Như được mô tả trong đoạn tiếp theo, hầu hết các tài nguyên (ngoài bộ nhớ, rất dồi dào và có thể được tái chế khá lười biếng) không bị ràng buộc với tuổi thọ của đối tượng trong các ngôn ngữ này. Có một vài trường hợp sử dụng khác, nhưng chúng rất hiếm trong kinh nghiệm của tôi.
Điểm thứ hai của bạn, quản lý tài nguyên thủ công, hiện được xử lý thông qua một câu lệnh thực hiện dọn dẹp dựa trên phạm vi, nhưng không kết hợp việc này với thời gian sống của đối tượng (do đó không tương tác với an toàn bộ nhớ và bộ nhớ). Đây là using
trong C #, with
trong Python, try
-với tài nguyên trong các phiên bản Java gần đây.