Una chiamata a free () in C può fallire?

Una chiamata a free() fallire in alcun modo?

Per esempio:

 free(NULL); 

La possibilità di liberare un puntatore NULL non può fallire. E free non restituisce alcun errore, ma liberare memoria non allocata, memoria già liberata o il centro di un blocco assegnato è un comportamento indefinito – può causare un errore di memoria e il programma può abortire (o peggio, corrompe la struttura dell’heap e incidente successivo).

Oppure, ancora peggio, continua a correre ma danneggia completamente i tuoi dati e scrivili su disco senza che tu te ne accorga 🙂

La parte rilevante dello standard (C99) è la sezione 7.20.3.2 :

#include
void free(void *ptr);

La funzione free fa sì che lo spazio puntato da ptr sia deallocato, cioè reso disponibile per un’ulteriore allocazione. Se ptr è un puntatore nullo, non si verifica alcuna azione. Altrimenti, se l’argomento non corrisponde a un puntatore precedentemente restituito dalla funzione calloc , malloc o realloc , o se lo spazio è stato deallocato da una chiamata a free o realloc , il comportamento non è definito.

La funzione free non restituisce alcun valore.

free(NULL) non fa nulla; free su un puntatore che non è stato allocato con lo stesso allocatore ( malloc , calloc , ecc.) o che era già stato liberato non è definito. Dato che free resi free void , l’unico modo in cui può fallire è l’arresto anomalo (ad es. Segfault).

A meno che non invochiate un comportamento indefinito (come “double-free” o provate a free() una stringa letterale) free() non può fallire.

Sì, può fallire in più situazioni. Per esempio

  1. Si libera qualcosa che non è stato assegnato dynamicmente, ad es. Variabili sullo stack
  2. Alloca un puntatore e prova a liberare il puntatore + 1
 free(NULL); 

Chiamare free () con un puntatore nullo è permesso e non causerà un errore – Vedi: free () – Opengroup

Chiamare gratis con un puntatore precedentemente liberato causerà solitamente una violazione del segmento e il programma verrà terminato.

A seconda dell’implementazione, free() potrebbe non riuscire se si verifica un danneggiamento della memoria, ad esempio con questo:

 char *p = malloc(1000); *(p-1)=7; free(p); 

Anche se questo è un esempio forzato, cose simili possono accadere scappando alla fine o all’inizio di un array. Il primo che potresti conoscere è un errore di protezione in free() .