Il problema è principalmente un artefatto storico, non un'impossibilità di implementazione.
Il modo in cui la maggior parte dei compilatori C genera codice è che il compilatore vede solo ogni file sorgente alla volta; non vede mai l'intero programma contemporaneamente. Quando un file di origine chiama una funzione da un altro file di origine o una libreria, tutto il compilatore vede è il file di intestazione con il tipo restituito della funzione, non il codice effettivo della funzione. Ciò significa che quando esiste una funzione che restituisce un puntatore, il compilatore non ha modo di sapere se la memoria a cui punta il puntatore deve essere liberata o meno. Le informazioni per decidere che non vengono mostrate al compilatore in quel momento. Un programmatore umano, dall'altra parte, è libero di cercare il codice sorgente della funzione o la documentazione per scoprire cosa bisogna fare con il puntatore.
Se guardi a linguaggi di basso livello più moderni come C ++ 11 o Rust, scoprirai che hanno risolto il problema principalmente rendendo esplicita la proprietà della memoria nel tipo di puntatore. In C ++ userete un unique_ptr<T>
invece di un piano T*
per contenere la memoria e unique_ptr<T>
assicuratevi che la memoria venga liberata quando l'oggetto raggiunge la fine dell'ambito, a differenza del piano T*
. Il programmatore può passare la memoria l'uno unique_ptr<T>
dall'altro, ma può essercene solo uno che unique_ptr<T>
punta alla memoria. Quindi è sempre chiaro chi possiede la memoria e quando deve essere liberata.
C ++, per motivi di compatibilità con le versioni precedenti, consente ancora la gestione manuale della memoria vecchio stile e quindi la creazione di bug o modi per aggirare la protezione di a unique_ptr<T>
. Rust è ancora più rigoroso in quanto applica regole di proprietà della memoria tramite errori del compilatore.
Per quanto riguarda l'indecidibilità, il problema di arresto e simili, sì, se si attesta la semantica C non è possibile decidere per tutti i programmi quando liberare la memoria. Tuttavia, per la maggior parte dei programmi attuali, non per esercizi accademici o software difettosi, sarebbe assolutamente possibile decidere quando liberare e quando non farlo. Dopo tutto, questo è l'unico motivo per cui l'essere umano può capire quando liberarsi o meno in primo luogo.