La memoria (e i blocchi delle risorse) vengono restituiti al sistema operativo in punti deterministici durante l'esecuzione di un programma. Il flusso di controllo di un programma è di per sé sufficiente per sapere dove, di sicuro, una data risorsa può essere deallocata. Proprio come un programmatore umano sa dove scrivere fclose(file)
quando il programma ha finito.
I GC risolvono ciò rilevandolo direttamente durante il runtime quando viene eseguito il flusso di controllo. Ma la vera fonte della verità sul flusso di controllo è la fonte. Quindi, teoricamente, dovrebbe essere possibile determinare dove inserire le chiamate free()
prima della compilazione analizzando il sorgente (o AST).
Il conteggio dei riferimenti è un modo ovvio per implementarlo, ma è facile incontrare situazioni in cui i puntatori sono ancora referenziati (ancora nell'ambito) ma non più necessari. Questo semplicemente converte la responsabilità di deallocare manualmente i puntatori a una responsabilità per gestire manualmente l'ambito / i riferimenti a quei puntatori.
Sembra che sia possibile scrivere un programma in grado di leggere l'origine di un programma e:
- prevedere tutte le permutazioni del flusso di controllo del programma --- con un'accuratezza simile a quella di guardare l'esecuzione dal vivo del programma
- tiene traccia di tutti i riferimenti alle risorse allocate
- per ogni riferimento, attraversa tutto il successivo flusso di controllo per trovare il punto più antico in cui il riferimento è garantito per non essere mai dereferenziato
- a quel punto, inserisci un'istruzione di deallocation su quella riga di codice sorgente
C'è qualcosa là fuori che lo fa già? Non penso che Rust o C ++ puntatori intelligenti / RAII siano la stessa cosa.