La mémoire (et les verrous de ressources) sont retournés au système d'exploitation à des points déterministes pendant l'exécution d'un programme. Le flux de contrôle d'un programme suffit à lui seul à savoir où, à coup sûr, une ressource donnée peut être désallouée. Tout comme la façon dont un programmeur humain sait où écrire fclose(file)
lorsque le programme en a fini avec lui.
Les GC résolvent ce problème en le résolvant directement pendant l'exécution lorsque le flux de contrôle est exécuté. Mais la véritable source de vérité sur le flux de contrôle est la source. Donc, théoriquement, il devrait être possible de déterminer où insérer les free()
appels avant la compilation en analysant la source (ou AST).
Le comptage de références est un moyen évident d'implémenter cela, mais il est facile de rencontrer des situations où les pointeurs sont toujours référencés (toujours dans la portée) mais ne sont plus nécessaires. Cela convertit simplement la responsabilité de désallouer manuellement les pointeurs en une responsabilité de gérer manuellement la portée / les références à ces pointeurs.
Il semble qu'il soit possible d'écrire un programme capable de lire la source d'un programme et:
- prévoir toutes les permutations du flux de contrôle du programme --- avec une précision similaire à celle de l'exécution en direct du programme
- suivre toutes les références aux ressources allouées
- pour chaque référence, parcourez tout le flux de contrôle suivant afin de trouver le premier point où la référence est garantie de ne jamais être déréférencée
- à ce stade, insérez une instruction de désallocation à cette ligne de code source
Y a-t-il quelque chose qui le fait déjà? Je ne pense pas que Rust ou les pointeurs intelligents C ++ / RAII soient la même chose.