programowanieProgramista C

Opisz mechanizm dynamicznego przydzielania i zwalniania pamięci w C, główne funkcje (malloc, calloc, realloc, free) i powszechne błędy podczas ich używania.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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.

Pytanie z pułapką

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.

Przykłady rzeczywistych błędów z powodu nieznajomości szczegółów tematu


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 free dwa 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.