Speicher (und Ressourcensperren) werden an deterministischen Punkten während der Programmausführung an das Betriebssystem zurückgegeben. Der Steuerungsfluss eines Programms allein reicht aus, um zu wissen, wo eine bestimmte Ressource mit Sicherheit freigegeben werden kann. Genau wie ein menschlicher Programmierer weiß, wo er schreiben muss, fclose(file)
wenn das Programm damit fertig ist.
GCs lösen dies, indem sie es direkt zur Laufzeit herausfinden, wenn der Steuerungsfluss ausgeführt wird. Die wahre Quelle der Wahrheit über den Kontrollfluss ist jedoch die Quelle. Theoretisch sollte es also möglich sein, free()
vor dem Kompilieren zu bestimmen, wo die Aufrufe eingefügt werden sollen, indem die Quelle (oder AST) analysiert wird.
Die Referenzzählung ist ein naheliegender Weg, um dies zu implementieren, aber es ist leicht, Situationen zu begegnen, in denen noch auf Zeiger verwiesen wird (noch im Geltungsbereich), die jedoch nicht mehr benötigt werden. Dadurch wird die Verantwortung für die manuelle Freigabe von Zeigern in die Verantwortung für die manuelle Verwaltung des Bereichs / der Verweise auf diese Zeiger umgewandelt.
Es scheint möglich zu sein, ein Programm zu schreiben, das den Quellcode eines Programms lesen kann und:
- prognostizieren Sie alle Permutationen des Programmablaufs - mit der gleichen Genauigkeit, mit der Sie die Live-Ausführung des Programms verfolgen
- Verfolgen Sie alle Verweise auf zugewiesene Ressourcen
- Durchlaufen Sie für jede Referenz den gesamten nachfolgenden Kontrollfluss, um den frühesten Punkt zu finden, von dem garantiert wird, dass die Referenz niemals dereferenziert wird
- Fügen Sie an dieser Stelle eine Freigabeanweisung in die Quellcodezeile ein
Gibt es irgendetwas, das dies bereits tut? Ich denke nicht, dass Rust oder C ++ Smart Pointer / RAII dasselbe sind.