[Tech] OT - Programmazione C

Daniele Masini d.masini@tiscali.it
Gio 19 Feb 2004 10:59:56 CET


Liberare la memoria allocata con free() non significa rendere nullo il
relativo puntatore, infatti il puntatore rimane al valore che gli era stato
assegnato precedentemente dalla malloc(). Per non richiare di far
riferimento ad aree di memoria liberate e quindi non più appartenenti al
processo è opportuno utilizzare una semplice strategia: assegnare il valore
NULL al puntatore dopo aver liberato la memoria da questo puntata.

[...]
free(buff);
buff = NULL;
[...]

Per migliorare l'usabilità e la portabilità del codice, si può realizzare
una semplice funzione (ad es. libera()) contenente le istruzioni sopra
riportate, che il porcesso deve chiamare al posto di free().
In questo modo, quanlunque ulteriore riferimento (dereference) ad un
puntatore "liberato" porterebbe ad un errore, che evidenzierebbe il fatto
che si sta tentando di effettuare un'operazione illecita.

Daniele


----- Original Message ----- 
From: "Valerio Montagnani" <tech@vmontagnani.it>
To: "FLug-Tech" <tech@firenze.linux.it>
Sent: Wednesday, February 18, 2004 6:20 PM
Subject: [Tech] OT - Programmazione C


> Ciao a tutti.
>
> Ho provato a scrivere un programmino che allocasse dinamicamente un po' di
memoria, stampasse indirizzo e contenuto di una cella e infine liberasse la
RAM allocata precedentemente. Ho aggiunto, dopo la funzione free, una printf
che avrebbe dovuto stampare i valori della cella di ram ottenuti prima di
aver liberato la memoria. Mi sarei aspettato un errore o un risultato
casuale, dato che quella locazione sarebbe dovuta essere vuota, mentre il
computer mi ha restituito gli stessi valori di prima.
> E' possibile che abbia sbagliato a liberare la ram?
>
> #include <stdio.h>
> float *buff[10];
> main() {
>  if ((buff[10]=(float *)malloc(10)))==NULL) {
>   printf("Errore di allocazione.");
>   exit(1);
>  }
>  printf("%p %d\n",&buff[5],buff[5]);
>  free(buff);
>  printf("%p %d\n",&buff[5],buff[5]);
> }
>
>
> Grazie, Vale
>
> -- 
> Valerio Montagnani        (Lug-Account)        <tech@vmontagnani.it>
>               pub 1024/C7E4BC57    sub 2048g/0E170155
> Key fingerprint = D5A4 EDFC 060C 5BD6 E2DD  8252 3B67 C1EB C7E4 BC57
> _______________________________________________
> FLUG - Discussioni tecniche - tech@firenze.linux.it
> URL: http://lists.firenze.linux.it/mailman/listinfo/tech
> Archivio: http://lists.firenze.linux.it/pipermail/tech
> Ricerca nell'archivio: http://www.firenze.linux.it/search




Maggiori informazioni sulla lista flug-tech