PDA

View Full Version : Strutture e calloc


drakend
22-02-2004, 12:11
Salve,
ho una struttura in cui appaiono dei puntatori inizialmente impostati a NULL e che poi vengono eventualmente assegnati ad aree di memoria tramite calloc durante l'esecuzione del programma. A volte ho la necessità di deallocare alcune istanze di questa struttura: io so che per farlo bisogna usare la funzione free(). Fin qui nessuno problema: mi sorge però un tremendo dubbio: se faccio free(nomeIstanzaStruttura) viene deallocata l'istanza della struttura... ma anche le aree di memoria puntate dai puntatori o solo gli spazi di memoria in cui è memorizzato il valore del puntatore?

VegetaSSJ5
22-02-2004, 12:57
guarda, la funzione free ha questo prototipo:

void free (void *ptr)

quindi a tale funzione non devi passare l'istanza direttamente ma un puntatore a quella istanza. quindi deevi creare n puntatore al tuo oggetto e quindi passarlo alla free per deallocare la memoria occupata. cmq per la domanda che hai fatto puoi star tranquillo che non verranno distrutti anche gli altri oggetti puntati dall'oggetto che hai cancellato, altrimenti in una lista se cancelli il primo elemento poi li cancelleresti tutti...:sofico:

cionci
22-02-2004, 13:07
La free non è ricorsiva...

Ti faccio un esempio...

struct s {
char a[30];
int *c;
};

Se c è stato allocato con calloc o malloc la free su s non libera la memoria puntata da c...
Devi prima delallocare c e poi s....

drakend
22-02-2004, 13:32
Originariamente inviato da VegetaSSJ5
guarda, la funzione free ha questo prototipo:

void free (void *ptr)

quindi a tale funzione non devi passare l'istanza direttamente ma un puntatore a quella istanza. quindi deevi creare n puntatore al tuo oggetto e quindi passarlo alla free per deallocare la memoria occupata. cmq per la domanda che hai fatto puoi star tranquillo che non verranno distrutti anche gli altri oggetti puntati dall'oggetto che hai cancellato, altrimenti in una lista se cancelli il primo elemento poi li cancelleresti tutti...:sofico:
Hai ragione, ora che me la fai vedere sotto questo punto di vista non posso che darti ragione e rendermi conto che il mio dubbio era una cazzata. :)