Pamięć (i blokady zasobów) są zwracane do systemu operacyjnego w deterministycznych punktach podczas wykonywania programu. Przepływ sterujący programu sam w sobie wystarczy, aby wiedzieć, gdzie z pewnością dany zasób może zostać zwolniony. Dokładnie tak, jak ludzki programista wie, gdzie pisać, fclose(file)
gdy program z nim skończy.
GC rozwiązują ten problem, ustalając go bezpośrednio w czasie wykonywania, gdy wykonywany jest przepływ sterowania. Ale prawdziwym źródłem prawdy o przepływie kontroli jest źródło. Teoretycznie powinno być możliwe określenie, gdzie wstawić free()
wywołania przed kompilacją, poprzez analizę źródła (lub AST).
Liczenie referencji jest oczywistym sposobem na zaimplementowanie tego, ale łatwo jest napotkać sytuacje, w których wskaźniki są nadal przywoływane (nadal w zakresie), ale nie są już potrzebne. To po prostu przekształca odpowiedzialność za ręczne zwolnienie wskaźników na odpowiedzialność za ręczne zarządzanie zakresem / referencjami do tych wskaźników.
Wygląda na to, że można napisać program, który potrafi odczytać źródło programu i:
- przewidzieć wszystkie permutacje przepływu sterowania programem --- z podobną dokładnością jak oglądanie wykonywania programu na żywo
- śledź wszystkie odniesienia do przydzielonych zasobów
- dla każdego odniesienia przejrzyj cały kolejny przepływ sterowania, aby znaleźć najwcześniejszy punkt, w którym odniesienie gwarantuje, że nigdy nie zostanie oderwane
- w tym momencie wstaw instrukcję dealokacji w tym wierszu kodu źródłowego
Czy jest coś, co już to robi? Nie sądzę, aby inteligentne wskaźniki / RAII w Rust lub C ++ były tym samym.