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 da solo è sufficiente per sapere dove, di sicuro, una data risorsa può essere deallocata. Proprio come un programmatore umano sa dove scrivere al fclose(file)
termine del programma.
I GC lo risolvono capendolo direttamente durante il runtime quando viene eseguito il flusso di controllo. Ma la vera fonte di verità sul flusso di controllo è la fonte. Quindi, in teoria, dovrebbe essere possibile determinare dove inserire le free()
chiamate prima della compilazione analizzando l'origine (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 sono più necessari. Ciò converte solo la responsabilità della deallocazione manuale dei puntatori in una responsabilità di gestire manualmente l'ambito / i riferimenti a tali puntatori.
Sembra che sia possibile scrivere un programma in grado di leggere la fonte 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
- tenere traccia di tutti i riferimenti alle risorse allocate
- per ogni riferimento, attraversare l'intero flusso di controllo successivo al fine di trovare il primo punto in cui è garantito che il riferimento non venga mai negato
- a quel punto, inserire una dichiarazione di deallocazione in quella riga di codice sorgente
C'è qualcosa là fuori che lo fa già? Non penso che i puntatori intelligenti Rust o C ++ / RAII siano la stessa cosa.