Nell'allocazione dinamica, uno spazio di memoria di una certa dimensione è riservato in fase di esecuzione per un uso esclusivo da parte del processo che lo alloca.
La lingua C ha diverse funzioni complementari per la gestione della memoria dinamica. I più comunemente implementati sono Malloc (), RealLoc () e Free () che fanno parte della libreria standard e sono definiti in "stdlib.H ”intestazione. Queste tre funzioni assegnano la memoria a un processo, cambiano le sue dimensioni e la liberano di nuovo.
Nella programmazione, è molto importante gestire rigorosamente la memoria dinamica perché ogni volta che allochiamo le risorse a un programma, le allontaniamo dal sistema operativo. La cattiva gestione della memoria dinamica può avere conseguenze catastrofiche per i processi che funzionano nel sistema in quel momento.
In questo articolo di Linux Sum.
Ti mostreremo la sintassi e la descrizione di come funziona, l'argomento di input e il tipo di dati che lo costituiscono. Quindi, implementeremo l'uso della funzione Free () in esempi pratici con frammenti di codice e immagini che ne dimostrano l'uso e i suoi effetti sul sistema.
Sintassi della funzione gratuita () in lingua C
void libero (void *ptr);
Descrizione della funzione gratuita () in lingua C
La funzione Free () libera una quantità specificata di memoria allocata dinamicamente.
La memoria dinamica viene assegnata chiamando la funzione Malloc () e specificando la dimensione nei byte dell'area che si desidera allocare nel suo argomento di input. Di conseguenza, questa funzione restituisce il puntatore "PTR" che indica l'area appena allocata.
La funzione Free () libera lo spazio di memoria riservata a cui è riferito da "PTR" nel suo singolo argomento di input e ne restituisce la disponibilità al sistema operativo. Questa funzione non restituisce risultati e non ha una definizione di errore in “Errno.H" intestazione.
La funzione Free () fa parte della libreria standard ed è definita in “Stdlib.H" intestazione. Per usarlo e le altre funzioni di gestione della memoria dinamica, è necessario includere questa intestazione nel codice come segue:
#includere
Come liberare la memoria allocata dinamicamente utilizzando la funzione Free ()
In questo esempio, creiamo un'applicazione di console molto semplice che ci dà il controllo sull'allocazione della memoria con la funzione Malloc () e liberando la memoria con la funzione Free (). Quindi compiliamo il codice ed eseguiamo l'applicazione, monitoriamo il sistema e osserviamo gli effetti.
Per creare l'applicazione della console, includiamo innanzitutto le intestazioni richieste e apriamo una funzione principale () con un ritorno vuoto. Dichiariamo il puntatore "PTR" in esso utilizzato nelle funzioni Malloc () e Free () per i puntatori nelle aree di memoria allocate. Dichiariamo anche la dimensione intera che determina la dimensione della memoria allocata e l'opzione intera che è la condizione per l'interruttore che utilizziamo per selezionare l'opzione di menu.
Una volta dichiarate le variabili richieste, l'applicazione visualizza il loro PID utilizzando le funzioni printf () e getpid (). Quindi, il programma inserisce un ciclo infinito in cui visualizza un menu con due opzioni. L'elemento selezionato dall'utente viene recuperato utilizzando la funzione scanf () nell'opzione intera ed è la condizione per un interruttore con due casi, uno per ciascuna opzione.
L'opzione 1 chiama la funzione Malloc () che alloca un blocco di memoria da 122 MB al processo. Mentre l'opzione 2 libera quel blocco chiamando la funzione gratuita (). Puoi vedere il codice completo di questa applicazione nella seguente illustrazione:
#includere
#includere
#includere
#includere
void main ()
opzione int;
char *ptr;
dimensione int = 64000000;
printf ("\ nprocess ID: %i \ n", getpid ());
while (1)
printf ("\ n [1] alloca memoria.\ n [2] rilascio della memoria.\N");
scanf ("%i", & opzione);
switch (opzione)
caso 1:
printf ("\ nallocating Memory… \ n");
Ptr = malloc (dimensione*sizeof (char));
rottura;
Caso 2:
printf ("\ nreasing Memory… \ n");
libero (PTR);
rottura;
// end switch
// end while (1)
Si noti che nel caso 1, la funzione Malloc () alloca un'area di memoria di dimensioni e restituisce il puntatore "PTR". Nel caso 2, la funzione Free () utilizza lo stesso puntatore dell'argomento di input per liberare la memoria allocata.
Per vedere gli effetti di queste due funzioni sul sistema, dobbiamo aprire due console di comando. Nel Terminal 1, eseguiamo il comando superiore per vedere le risorse utilizzate da ciascun processo di sistema. In Terminal 2, compiliamo ed eseguiamo l'applicazione che abbiamo appena visto.
Una volta che l'applicazione è in esecuzione, esaminiamo la console 1 per le risorse utilizzate dal processo il cui PID viene visualizzato nella console 2.
Come possiamo vedere nella figura, il sistema ha assegnato il numero PID 13009 al processo. Possiamo vedere nella colonna 10 del terminale sinistro che la nostra applicazione consuma meno di 0.1% della memoria del sistema.
Se selezioniamo l'opzione 1 della nostra applicazione e premere "INVIO", la funzione Malloc () alloca 122 MB di memoria al processo.
Come possiamo vedere in questa immagine, la memoria utilizzata dalla nostra applicazione è ora 3.6% della memoria totale disponibile nel sistema.
Ora selezioniamo l'opzione 2 della nostra applicazione che chiama la funzione Free (), passando il puntatore "PTR" come argomento di input. Questa azione libera la memoria allocata dalla funzione Malloc () nell'opzione 1.
In questa immagine, possiamo vedere come la funzione Free () ha liberato la memoria allocata da 3.6% a 0.1% del sistema totale utilizzato dalla nostra applicazione.
Conclusione
In questo articolo di Linux, ti abbiamo mostrato come utilizzare la funzione gratuita () per liberare la memoria allocata dinamicamente. Abbiamo esaminato la sintassi di questa funzione e la descrizione teorica di come funziona.
Quindi, abbiamo applicato ciò che abbiamo appreso in un esempio pratico con frammenti di codice e immagini in cui abbiamo creato un'applicazione di console che controlla la chiamata delle funzioni Malloc () e Free (). Lo abbiamo eseguito passo per passo e monitorato il sistema per vedere gli effetti di chiamare le funzioni per allocare e liberare la memoria del sistema.