Liberare la memoria con free()
Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 35 di 63.
Quando allochi memoria in modo dinamico usando malloc(), quella memoria rimane allocata finché non la rilasci esplicitamente. La funzione free() è lo strumento che usi per restituire al sistema la memoria allocata dinamicamente quando hai finito di usarla.
La funzione free() accetta un argomento: un puntatore al blocco di memoria che vuoi deallocare. Deve essere lo stesso puntatore restituito da malloc() (o da funzioni correlate come calloc()).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Alloca memoria
*ptr = 42; // Usa la memoria
free(ptr); // Libera la memoria quando hai finitoNon chiamare free() crea quello che è noto come perdita di memoria. La memoria allocata rimane riservata dal tuo programma anche se non la stai più usando. Nei programmi a esecuzione prolungata o in quelli che allocano memoria ripetutamente, queste perdite possono consumare tutta la memoria di sistema disponibile e causare problemi di prestazioni o arresti anomali.
Ricorda: ogni malloc() dovrebbe avere un corrispondente free(). Questa corrispondenza è essenziale per una gestione responsabile della memoria nella programmazione in C.
Sfida
FacileScrivi un programma in C che dimostri il ciclo di vita completo dell'allocazione e della deallocazione dinamica della memoria. Il programma dovrebbe:
- Leggere dall'utente un intero
countche rappresenta quanti interi memorizzare - Usare
malloc()consizeof()per allocare dinamicamente memoria per un array dicountinteri - Controllare se l'allocazione della memoria è riuscita: in caso contrario, stampare
Memory allocation failed!e terminare il programma - Se l'allocazione riesce, stampare
Memory allocated successfully! - Leggere dall'utente
countvalori interi e memorizzarli nell'array allocato - Calcolare e stampare la somma di tutti i valori nel formato:
Sum: [value] - Trovare e stampare il valore massimo nel formato:
Maximum: [value] - Usare
free()per deallocare la memoria - Stampare
Memory freed successfully!per confermare la pulizia
Ricorda di includere l'header <stdlib.h> per usare malloc() e free(). Questa sfida dimostra l'essenziale abbinamento di malloc() e free() per prevenire le perdite di memoria nei tuoi programmi.
Per esempio, se l'input è:
4
15 8 23 12L'output dovrebbe essere:
Memory allocated successfully!
Sum: 58
Maximum: 23
Memory freed successfully!Questa sfida rafforza il concetto fondamentale che ogni blocco di memoria allocato dinamicamente deve essere liberato correttamente quando non è più necessario, completando il ciclo di gestione responsabile della memoria nella programmazione in C.
Provalo tu
#include <stdio.h>
#include <stdlib.h>
int main() {
int count;
// Leggi il numero di interi da memorizzare
scanf("%d", &count);
// TODO: Scrivi il tuo codice qui sotto
// 1. Alloca memoria usando malloc() con sizeof()
// 2. Verifica se l'allocazione è riuscita
// 3. Leggi i valori interi e memorizzali
// 4. Calcola la somma e trova il valore massimo
// 5. Libera la memoria allocata
return 0;
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Fondamenti dei puntatori
Che cos’è un puntatore?Dichiarare i puntatoriL’operatore di indirizzo (&)L’operatore di dereferenziazione (*)Puntatori NULLRiepilogo: nozioni di base sui puntatori4Progetto: Utility di testo semplice
Panoramica del progettoConteggio dei caratteri2Puntatori e array
I nomi degli array come puntatoriElementi degli array e puntatoriAritmetica dei puntatoriConfrontare i puntatoriRiepilogo: attraversamento di un array con i puntatori5Puntatori e funzioni
Passaggio per valorePassare puntatori alle funzioniModificare le variabili tramite puntatoriUn esempio classico: scambiare valoriPassare array alle funzioniRiepilogo: argomenti puntatore nelle funzioni3Array di caratteri e stringhe
Stringhe come array di charIl terminatore nullInput di stringhe con scanfUso di strlen()Uso di strcpy()Uso di strcat()Uso di strcmp()Riepilogo: funzioni di base per le stringhe6Gestione della memoria
Memoria Stack vs. HeapAllocazione dinamica - malloc()Usare sizeof() per l'allocazioneVerificare il fallimento dell'allocazioneLiberare la memoria con free()Allocare con calloc()Riepilogo: array dinamico9Progetto: Inserimento semplice di un contatto
Progetto: Definire una struct ContattoFunzione per creare un contattoEsercitati da solo: Compilatore C online