La memoria (y los bloqueos de recursos) se devuelven al sistema operativo en puntos deterministas durante la ejecución de un programa. El flujo de control de un programa por sí solo es suficiente para saber dónde, con seguridad, se puede desasignar un recurso dado. Al igual que un programador humano sabe dónde escribir fclose(file)
cuando el programa termina con él.
Los GC resuelven esto resolviéndolo directamente durante el tiempo de ejecución cuando se ejecuta el flujo de control. Pero la verdadera fuente de verdad sobre el flujo de control es la fuente. Entonces, en teoría, debería ser posible determinar dónde insertar las free()
llamadas antes de la compilación analizando la fuente (o AST).
El conteo de referencias es una forma obvia de implementar esto, pero es fácil encontrar situaciones en las que todavía se hace referencia a los punteros (todavía en el alcance) pero ya no son necesarios. Esto solo convierte la responsabilidad de desasignar manualmente punteros en una responsabilidad de administrar manualmente el alcance / referencias a esos punteros.
Parece que es posible escribir un programa que pueda leer la fuente de un programa y:
- predecir todas las permutaciones del flujo de control del programa --- con una precisión similar a la de ver la ejecución en vivo del programa
- rastrear todas las referencias a los recursos asignados
- para cada referencia, recorra todo el flujo de control posterior para encontrar el primer punto en el que se garantiza que la referencia nunca se desreferenciará
- en ese punto, inserte una declaración de desasignación en esa línea de código fuente
¿Hay algo por ahí que ya haga esto? No creo que los punteros inteligentes Rust o C ++ / RAII sean lo mismo.