Bellek (ve kaynak kilitleri) bir programın yürütülmesi sırasında belirleyici noktalarda işletim sistemine geri gönderilir. Bir programın kendi başına kontrol akışı kesin olarak, belirli bir kaynağın nerede dağıtılabileceğini bilmek için yeterlidir. Tıpkı bir programcının fclose(file)
programın ne zaman yapıldığını nasıl yazacağını bildiği gibi.
GC'ler bunu, kontrol akışı yürütüldüğünde çalışma zamanında doğrudan çözerek çözerler. Ancak kontrol akışıyla ilgili gerçek gerçeğin kaynağı kaynaktır. Bu yüzden teorik olarak, free()
kaynağı (veya AST) analiz ederek çağrıları derlemeden önce nereye ekleyeceğinizi belirlemek mümkün olmalıdır .
Referans sayımı bunu uygulamanın açık bir yoludur, ancak işaretçilerin hala başvuruda bulunduğu (hala kapsamda) ancak artık ihtiyaç duyulmayan durumlarla karşılaşmak kolaydır. Bu sadece işaretçilerin manuel olarak dağıtılması sorumluluğunu, işaretçilerin kapsamını / referanslarını manuel olarak yönetme sorumluluğuna dönüştürür.
Bir programın kaynağını okuyabilen bir program yazmak mümkün gibi görünüyor:
- programın kontrol akışının tüm izinlerini --- programın canlı çalışmasını izlemeye benzer doğrulukta tahmin edin
- tahsis edilmiş kaynaklara yapılan tüm referansları takip edin
- Her referans için, referansın asla geri alınamayacağının garantilendiği en eski noktayı bulmak için tüm kontrol akışını çaprazlayın.
- Bu noktada, kaynak kodunun bu satırına bir gider kodu ekleyiniz.
Dışarıda bunu yapan bir şey var mı? Rust veya C ++ akıllı işaretçiler / RAII aynı şey olduğunu sanmıyorum.