2015-05-01 20 views
13

Il seguente codice libera la memoria allocata per x?Libera un puntatore assegnato

int main() 
{ 
    char *x = (char*)calloc(100, sizeof(char)); 
    char *y = x; 
    free(y); 
} 
+4

sì, libera la memoria allocata per x –

+9

[Non eseguire il cast 'malloc()' (o 'calloc()')!] (Http://stackoverflow.com/a/605858/3488231) – ace

+0

@AndreyChernukha, La risposta è [dipende] (http://stackoverflow.com/a/30000348/3049655). (Hai postato quel commento * prima * modifica l'OP) –

risposta

18

Quando si esegue

char *y = x; 

apportate y punto alla posizione in cui x punti. Dal momento che y punta a una locazione di memoria restituita da calloc,

free(y); 

è perfettamente valida.Come @hacckscommented, questo non funzionerebbe se si effettua il punto in un'altra posizione di memoria, a condizione che questa posizione di memoria non sia stata restituita da malloc/calloc/realloc.


In C, si should not cast the result of malloc/calloc/realloc. Inoltre, controllare il valore di ritorno di calloc per vedere se ha avuto successo è buono. calloc restituirà NULL in caso di errore.

+0

Sarebbe bello se si aggiungesse che questo non funziona se 'y' è riassegnato ad un'altra posizione di memoria. – haccks

+0

Tecnicamente, 'free (NULL)' è legale e non operativo, quindi in questo esempio estremamente semplicistico, il codice OP è perfettamente in grado di non controllare il valore restituito. – Kevin

+0

@haccks, fatto :) –

5

La versione originale della questione avevano

int *y = x; 
free(y); 

Vale a dire assegnare il puntatore char a un puntatore int e quindi richiamare free() sul puntatore int. La firma di free() è void free(void *ptr); quindi indipendentemente dallo char * rispetto allo int *, la memoria verrebbe rilasciata.

La versione modificata (e attuale) della questione ha

char *y = x; 
free(y); 

Qui, entrambi y e x punti alla stessa memoria. Questo è noto come aliasing del puntatore. Dopo la chiamata a free(), quella memoria sarebbe stata sicuramente rilasciata.

Un problema, tuttavia, è che dopo free(y), il puntatore x sarebbe penzoloni, cioè la memoria si sta puntando non è più valida.

Nota: non è necessario né consigliabile trasmettere il valore restituito da calloc.

+0

'char * x = ...; int * y = x; 'provoca un comportamento non definito, dovuto all'assegnazione a un tipo di puntatore incompatibile. Successivamente può succedere di tutto. Quindi la risposta corretta sarebbe "* Può essere. *". – alk

+2

L'assegnazione di "a un tipo di puntatore incompatibile" non ha, di per sé, un comportamento non definito. Risultati del comportamento non definito se quel puntatore di tipo incompatibile è dereferenziato. Il codice nella versione originale della domanda non lo faceva, quindi non mostrava un comportamento indefinito. – Peter

0

La memoria restituita dalla chiamata di calloc() viene rilasciata dalla chiamata di free().

Nel codice che interessa sia x e .

1

Sì, lo fa.

Il metodo è void free(void *ptr), quindi quando si crea char* y = x, si ha un puntatore alla stessa memoria di spazio che stava puntando a .

Ciò consente di liberare lo spazio in seguito con free (y).

Tuttavia, si dovrebbe inserire x = NULL perché ora x non dispone di uno spazio proprio nonostante abbia un valore.

Per ulteriori informazioni sulla lettura gratuita here.