È necessario chiamare la funzione gratuita ogni volta che usiamo malloc in C. Lo sto chiedendo perché ho visto molte volte che non è stato chiamato.
Grazie
Se l'oggetto vive fino alla fine del programma, allora non bisogno di per chiamare free
, ma ritengo che sia ancora una buona pratica farlo. Il motivo è che, alla fine dell'esecuzione del codice, tutta la memoria sarà free
'd in ogni caso, quindi non c'è bisogno di farlo in modo esplicito. Altrimenti, sì; usa free
sempre.
Come sottolineato in questa domanda , per il caso particolare di liberare memoria immediatamente prima di terminare il programma , free
è una perdita di tempo se il tuo programma funziona praticamente su qualsiasi sistema operativo moderno sistema. Farai in modo che l'allocatore esegua il monitoraggio della memoria e la contrassegni come inutilizzata, nonostante il sistema operativo possa liberare la memoria in un colpo solo. Come Raymond Chen sottolinea , se la quantità di memoria da liberare all'uscita del programma è grande, il tempo sprecato può essere significativo.
Tuttavia, questo comportamento è ancora dipendente dal sistema operativo. Riguardo a la lingua , è sempre sbagliato per non liberare memoria. Ancora più importante, strumenti come Lint o Valgrind segnaleranno questo come un errore, e se ti abitui a ignorare i loro errori, sconfiggi lo scopo di usarli. Quindi considererei l'ottimizzazione della pratica di non liberare all'uscita dal programma e non dovresti ottimizzare in anticipo.
Se non stiamo parlando dell'uscita del programma, il fallimento di free
è sicuramente un bug. Nessuno dovrebbe intenzionalmente farlo se il loro obiettivo è scrivere un programma che non presenti perdite di memoria.
Ogni chiamata a malloc alloca memoria sullo heap e restituisce un puntatore ad esso. Se non chiami libero sul puntatore restituito, la memoria non viene liberata (quindi ottieni una perdita di memoria).
In molti casi banali non è davvero necessario chiamare gratis (cioè l'applicazione probabilmente funzionerà senza di essa), ma la maggior parte delle persone (giustamente) considera un errore non libera la memoria .
Ci sono anche casi in cui si assegna memoria con malloc e lo si lascia in una variabile statica o globale, facendo affidamento sul sistema operativo per rilasciare questa memoria quando l'applicazione termina l'esecuzione. Normalmente non dovresti farlo. Se hai bisogno di un blocco di memoria per rimanere assegnato fino a quando una libreria ha del lavoro da fare, considera l'aggiunta di un'API Finalize / Close / Finish / Uninitialize alla libreria che disalloca questa memoria (tale API dovrebbe essere chiamata come ultima chiamata del tuo programma nell'API della libreria).
TLDR: Anche se nella maggior parte dei casi potrebbe non essere strettamente necessario, omettendo di liberare la memoria è un bug e tu (probabilmente) dovresti evitarlo (cioè assicurati di chiamare sempre gratis per la memoria malloc-ed).