W języku C pamięć dla zmiennych może być przydzielana albo w stosie (stack), albo w stercie (heap).
malloc, calloc, realloc i zwalnia ją ręcznie przez free. Objętość pamięci jest ograniczona możliwościami systemu, ale dostęp jest wolniejszy, a zwolnienie pamięci kontrolowane ręcznie.Kiedy używać stosu:
Kiedy używać sterty:
// Na stosie int arr[10]; // Na stercie int* parr = malloc(sizeof(int) * 10); // Nie zapomnij zwolnić pamięci free(parr);
Pytanie: Co się stanie, jeśli do tablicy przydzielonej przez malloc nie wywoła się funkcji free?
Odpowiedź: Dojdzie do wycieku pamięci (memory leak). Dynamicznie przydzielona pamięć nie zostanie automatycznie zwolniona, co z czasem może prowadzić do wyczerpania pamięci aplikacji lub całego systemu.
void leak() { int* leakArr = malloc(100 * sizeof(int)); // Brak wywołania free(leakArr), pamięć jest tracona }
Historia
W pewnym projekcie programiści przydzielali pamięć dla struktury opisującej sesję użytkownika przez malloc, ale zapomnieli wywołać free po zakończeniu pracy z sesją. W efekcie projekt przez kilka dni tracił pamięć, serwer „upadał” z błędem braku pamięci. Problem został rozwiązany dopiero po profilowaniu z Valgrind i naprawieniu wszystkich pominiętych free.
Historia
Programista przydzielił dużą tablicę (do 10 MB) na stosie dla tymczasowych obliczeń. Na serwerze z małym rozmiarem stosu doprowadziło to do awarii aplikacji z błędem przekroczenia stosu. Po analizie należało przenieść bufor do sterty.
Historia
Jeden z programistów postanowił przechowywać długie ciągi w stosie, ale rozmiar ciągu był subiektywnie określany przez użytkownika. Przy wprowadzeniu bardzo długiego ciągu aplikacja się zawieszała z błędem dostępu do pamięci. Ostatecznie podjęto decyzję o przeniesieniu wprowadzonych danych do sterty z kontrolą długości.