Alloca size byte nello heap. La memoria viene inizializzata a 0.
La funzione restituisce il puntatore alla zona di memoria allocata in caso di successo e NULL in caso di fallimento, nel qual caso errno assumerà il valore ENOMEM.
Alloca size byte nello heap. La memoria non viene inizializzata.
La funzione restituisce il puntatore alla zona di memoria allocata in caso di successo e NULL in caso di fallimento, nel qual caso errno assumerà il valore ENOMEM.
Cambia la dimensione del blocco allocato all'indirizzo ptr portandola a size.
La funzione restituisce il puntatore alla zona di memoria allocata in caso di successo e NULL in caso di fallimento, nel qual caso errno assumerà il valore ENOMEM.
Disalloca lo spazio di memoria puntato da ptr.
La funzione non ritorna nulla e non riporta errori.
In genere si usano le funzioni malloc e calloc per allocare dinamicamente la quantità di memoria necessaria al programma indicata da size,6 e siccome i puntatori ritornati sono di tipo generico non è necessario effettuare un cast per assegnarli a puntatori al tipo di variabile per la quale si effettua l'allocazione.
La memoria allocata dinamicamente deve essere esplicitamente rilasciata usando free7 una volta che non sia più necessaria. Questa funzione vuole come parametro un puntatore restituito da una precedente chiamata a una qualunque delle funzioni di allocazione che non sia già stato liberato da un'altra chiamata a free, in caso contrario il comportamento della funzione è indefinito.
La funzione realloc si usa invece per cambiare (in genere aumentare) la dimensione di un'area di memoria precedentemente allocata, la funzione vuole in ingresso il puntatore restituito dalla precedente chiamata ad una malloc (se è passato un valore NULL allora la funzione si comporta come malloc)8 ad esempio quando si deve far crescere la dimensione di un vettore. In questo caso se è disponibile dello spazio adiacente al precedente la funzione lo utilizza, altrimenti rialloca altrove un blocco della dimensione voluta, copiandoci automaticamente il contenuto; lo spazio aggiunto non viene inizializzato.
Si deve sempre avere ben presente il fatto che il blocco di memoria restituito da realloc può non essere un'estensione di quello che gli si è passato in ingresso; per questo si dovrà sempre eseguire la riassegnazione di ptr al valore di ritorno della funzione, e reinizializzare o provvedere ad un adeguato aggiornamento di tutti gli altri puntatori all'interno del blocco di dati ridimensionato.
Un errore abbastanza frequente (specie se si ha a che fare con vettori di puntatori) è quello di chiamare free più di una volta sullo stesso puntatore; per evitare questo problema una soluzione di ripiego è quella di assegnare sempre a NULL ogni puntatore liberato con free, dato che, quando il parametro è un puntatore nullo, free non esegue nessuna operazione.
Le glibc hanno un'implementazione delle routine di allocazione che è controllabile dall'utente attraverso alcune variabili di ambiente, in particolare diventa possibile tracciare questo tipo di errori usando la variabile di ambiente MALLOC_CHECK_ che quando viene definita mette in uso una versione meno efficiente delle funzioni suddette, che però è più tollerante nei confronti di piccoli errori come quello di chiamate doppie a free. In particolare:
Un caso tipico che illustra il problema è quello in cui in una subroutine si alloca della memoria per uso locale senza liberarla prima di uscire. La memoria resta così allocata fino alla terminazione del processo. Chiamate ripetute alla stessa subroutine continueranno ad effettuare altre allocazioni, causando a lungo andare un esaurimento della memoria disponibile (e la probabile impossibilità di proseguire l'esecuzione del programma).
Il problema è che l'esaurimento della memoria può avvenire in qualunque momento, in corrispondenza ad una qualunque chiamata di malloc, che può essere in una sezione del codice che non ha alcuna relazione con la subroutine che contiene l'errore. Per questo motivo è sempre molto difficile trovare un memory leak.
In C e C++ il problema è particolarmente sentito. In C++, per mezzo della programmazione ad oggetti, il problema dei memory leak è notevolmente ridimensionato attraverso l'uso accurato di appositi oggetti come gli smartpointers. Questo però va a scapito delle prestazioni dell'applicazione in esecuzione.
In altri linguaggi come il java e recentemente il C# il problema non si pone nemmeno perché la gestione della memoria viene fatta totalmente in maniera automatica, ovvero il programmatore non deve minimamente preoccuparsi di liberare la memoria allocata precedentemente quando non serve più, poiché il framework gestisce automaticamente la cosiddetta garbage collection. In tal caso, attraverso meccanismi simili a quelli del reference counting, quando una zona di memoria precedentemente allocata non è più riferita da nessuna parte del codice in esecuzione, può essere deallocata automaticamente in qualunque momento dall'infrastruttura.
Anche questo va a scapito delle prestazioni dell'applicazione in esecuzione (inoltre le applicazioni sviluppate con tali linguaggi di solito non sono eseguibili compilati, come avviene invece per il C ed il C++, ed è necessaria la presenza di una infrastruttura per la loro interpretazione e pertanto hanno di per sé delle prestazioni più scadenti rispetto alle stesse applicazioni compilate direttamente). Questo comporta però il problema della non predicibilità del momento in cui viene deallocata la memoria precedentemente allocata da un oggetto.
Per limitare l'impatto di questi problemi, e semplificare la ricerca di eventuali errori, l'implementazione delle routine di allocazione delle glibc mette a disposizione una serie di funzionalità che permettono di tracciare le allocazioni e le disallocazione, e definisce anche una serie di possibili hook (ganci) che permettono di sostituire alle funzioni di libreria una propria versione (che può essere più o meno specializzata per il debugging). Esistono varie librerie che forniscono dei sostituti opportuni delle routine di allocazione in grado, senza neanche ricompilare il programma,9 di eseguire diagnostiche anche molto complesse riguardo l'allocazione della memoria.