ProgrammazioneSviluppatore C

Descrivi il meccanismo di allocazione e liberazione dinamica della memoria in C, le funzioni principali (malloc, calloc, realloc, free) e gli errori comuni nel loro utilizzo.

Supera i colloqui con l'assistente IA Hintsage

Risposta

Nel linguaggio C, per la gestione dinamica della memoria si utilizzano funzioni dalla libreria stdlib.h:

  • malloc(size_t size) — allocates a block of memory of the specified size. The memory is uninitialized.
  • calloc(size_t nmemb, size_t size) — allocates a block of memory for an array of nmemb elements of the specified size and initializes it to zeros.
  • realloc(void *ptr, size_t size) — changes the size of a previously allocated block of memory.
  • free(void *ptr) — frees a previously allocated block.

Esempio di utilizzo:

int *arr = (int *)malloc(10 * sizeof(int)); if (arr == NULL) { // Gestione dell'errore di allocazione della memoria } // ... lavoro con arr ... free(arr);

È importante controllare sempre il risultato dell'allocazione di memoria su NULL e ricordarsi di chiamare free per evitare perdite di memoria.

Domanda trabocchetto

Quale sarà il risultato del seguente codice?

int *arr = malloc(sizeof(int) * 5); free(arr); free(arr);

Risposta: Chiamare free ripetutamente per lo stesso blocco di memoria porta a comportamento indefinito (undefined behavior). Un puntatore può essere liberato solo una volta.

Esempi di errori reali a causa della mancanza di conoscenza delle sfumature dell'argomento


Storia

In un progetto di automazione dei test del sistema ci sono stati regolari crash. Il colpevole si è rivelato essere un ciclo sistemico, dove dopo ogni passaggio si dimenticava di liberare la memoria allocata tramite malloc. Di conseguenza, dopo test prolungati, il sistema "mangiava" tutta la memoria RAM e si bloccava.


Storia

L'implementazione di un array dinamico utilizzava realloc, senza controllare il risultato del ritorno. In caso di errore (realloc restituiva NULL), il puntatore alla memoria precedente veniva perso, causando una perdita di memoria. Successive tentativi di accesso alla memoria portavano a un segfault.


Storia

A un sviluppatore è stato richiesto di integrare un modulo C obsoleto, dove la memoria veniva liberata tramite free due volte di seguito per lo stesso puntatore. Su molteplici sistemi operativi non apparivano errori, ma su una nuova piattaforma l'applicazione ha cominciato a chiudersi in modo anomalo, la causa è stata scoperta dopo molto tempo: double-free.