W języku C, do dynamicznego zarządzania pamięcią, używane są funkcje z biblioteki stdlib.h:
malloc(size_t size) — przydziela blok pamięci o określonym rozmiarze. Pamięć nie jest inicjalizowana.calloc(size_t nmemb, size_t size) — przydziela blok pamięci dla tablicy z nmemb elementów o określonym rozmiarze i inicjalizuje je zerami.realloc(void *ptr, size_t size) — zmienia rozmiar wcześniej przydzielonego bloku pamięci.free(void *ptr) — zwalnia wcześniej przydzielony blok.Przykład użycia:
int *arr = (int *)malloc(10 * sizeof(int)); if (arr == NULL) { // Obsługa błędu przydzielania pamięci } // ... praca z arr ... free(arr);
WaŜne jest zawsze sprawdzać rezultat przydzielania pamięci na NULL i nie zapominać wywoływać free, aby uniknąć wycieków pamięci.
Jaki będzie wynik poniższego kodu?
int *arr = malloc(sizeof(int) * 5); free(arr); free(arr);
Odpowiedź: Powtórne wywołanie free dla tego samego wskaźnika prowadzi do niezdefiniowanego zachowania (undefined behavior). Zwalniać ten sam wskaźnik można tylko raz.
Historia
W projekcie automatyzacji testowania systemu występowały regularne awarie. Winowajcą okazał się systemowy cykl, w którym po każdym przebiegu zapomniano zwolnić pamięć przydzieloną przez
malloc. W wyniku długoterminowych testów system "zjadał" całą pamięć operacyjną i wieszał się.
Historia
Implementacja dynamicznej tablicy używała
realloc, nie sprawdzając wyniku zwrotu. W przypadku niepowodzenia (realloc zwrócił NULL) wskaźnik na starą pamięć został utracony, co prowadziło do wycieku pamięci. Następna próba pracy z pamięcią kończyła się segmentacją.
Historia
Programiście zlecono integrację przestarzałego modułu C, w którym pamięć zwalniano przez
freedwa razy pod rząd dla jednego wskaźnika. W większości systemów operacyjnych błędy się nie pojawiały, ale na nowej platformie aplikacja zaczęła się awaryjnie zamykać, przyczyna została odkryta po długim czasie: double-free.