2014-10-04 20 views
15

sto lavorando sulla conversione di molti programmi in C da Unix a Linux e questa sintassi free() ha attirato la mia attenzione:free() sintassi con argomenti in C

free((char *) area); 

Qual è la differenza tra questo e free(area);?

risposta

15

Se qualcuno memorizzava un puntatore ai dati allocati dinamici in un tipo non puntato sancito dallo standard, ad esempio area viene dichiarato come intptr_t ad esempio, questo lancia il non-puntatore a un tipo di puntatore e consente di liberarlo .

Se area è già un tipo di puntatore, questo non ha assolutamente senso con qualsiasi codice C scritto nell'ultimo quarto di secolo.

+0

Sì, è proprio il caso dell'area. Grazie! – user3772839

17

La firma di free è:

void free(void *ptr); 

Quindi, se area è un tipo di puntatore che viene restituito dalla malloc o dai suoi cugini, la conversione in free((char *) area); è inutile.

A meno che ... se il codice è realmente, molto vecchio, ovvero prima di ANSI C ha introdotto void * come puntatore generico. In quel tempo antico, char * viene utilizzato come puntatore generico.

+1

In effetti, il codice è piuttosto vecchio, circa 1990, scritto per i sistemi Unix della vecchia scuola di quell'epoca. area è un puntatore in un membro della struttura dichiarato come int. Grazie. – user3772839

1

La firma di free() nello standard è errata. Dovrebbe essere stato void free(const void *); per essere veramente corretto. Ciò ha la conseguenza che devi upcastare un const * quando vuoi liberarlo senza un avviso.

C'è a Linus Torvald rant about on why free() should take a const *. EDIZIONE: L'idea fondamentale per cui il problema è controverso deriva dal fatto che in generale la gente pensa che lo const abbia qualche rilevanza nella memoria puntata dal puntatore, cioè che il puntatore punti sulla memoria di sola lettura. Questo è palesemente falso. La qualifica const è una proprietà del puntatore, non della cosa a cui punta. Questa è una distinzione importante.

+3

Non ne sono convinto. 'malloc' restituisce non-const, quindi per una cosa è necessario avere un cast tra il' malloc' e 'free' perché questo sia necessario. Secondo, 'const' indica un contratto che significa che non si modifica il contenuto della memoria puntata. 'liberare quella memoria è una violazione di quel contratto. Non riesco a pensare a qualsiasi argomento per questo, quindi sarei interessato a argomenti che sono pro-const. – MicroVirus

+0

Vedere http://yarchive.net/comp/const.html per il rant di Linus Torvalds. – hmp

+0

MicroVirus, leggi il rant di Linus, lui lo spiega meglio che potrei e ha ragione. –