Memori (dan kunci sumber daya) dikembalikan ke OS pada titik deterministik selama eksekusi program. Alur kontrol suatu program dengan sendirinya cukup untuk mengetahui di mana, pasti, sumber daya yang diberikan dapat dialokasikan. Sama seperti bagaimana seorang programmer manusia tahu di mana harus menulis fclose(file)
ketika program selesai dengan itu.
GC menyelesaikan ini dengan mencari tahu secara langsung selama runtime ketika aliran kontrol dijalankan. Tetapi sumber kebenaran yang sebenarnya tentang aliran kontrol adalah sumbernya. Jadi secara teoritis, harus dimungkinkan untuk menentukan di mana memasukkan free()
panggilan sebelum kompilasi dengan menganalisis sumber (atau AST).
Penghitungan referensi adalah cara yang jelas untuk mengimplementasikan ini, tetapi mudah untuk menghadapi situasi di mana pointer masih dirujuk (masih dalam cakupan) namun tidak lagi diperlukan. Ini hanya mengkonversi tanggung jawab deallocating pointer secara manual ke tanggung jawab untuk mengelola secara manual ruang lingkup / referensi ke pointer tersebut.
Sepertinya mungkin untuk menulis sebuah program yang dapat membaca sumber program dan:
- memprediksi semua permutasi aliran kontrol program --- dengan akurasi yang sama seperti menonton eksekusi langsung program
- melacak semua referensi ke sumber daya yang dialokasikan
- untuk setiap referensi, lintasi seluruh aliran kontrol selanjutnya untuk menemukan titik paling awal bahwa referensi dijamin tidak akan pernah direferensikan
- pada saat itu, masukkan pernyataan deallokasi di baris kode sumber itu
Apakah ada sesuatu di luar sana yang sudah melakukan ini? Saya tidak berpikir Rust atau C ++ smart pointer / RAII adalah hal yang sama.