stavo leggendo il programma rubrica e mi sono reso conto che la memoria che viene allocata non viene liberata come mai????
stavo leggendo il programma rubrica e mi sono reso conto che la memoria che viene allocata non viene liberata come mai????
C/C++
Mi sto attrezzando, ma la telepatia non rientra ancora tra i miei poteri
A quale rubrica ti riferisci?
quella nella sezione programmazione - c
C/C++
Immagino tu ti riferisca a questa, no?
Vediamo... hai ragione la memoria non viene mai liberata, sia che si elimini un elemento dalla rubrica sia che si termini il programma. La cosa è molto strana... forse chi ha scritto il programma confidava nel fatto che il SO liberi da solo la memoria a fine programma :master:
La memoria va sempre liberata, almeno per 2 motivi:
1)Ho detto che il SO dovrebbe liberare la memoria; sfortunatamente non è sempre così. WindowsXp riesce a liberare la memoria usata ma altri SO potrebbero non riuscirci.
2)Il programma in questione è piccolo e la cosa non si nota, ma se si continua ad allocare e non si libera mai varie "stranezze" o crash potrebbero accadere.
La cosa cmq è curiosa... spero che qualcuno sappia dare qualche altra delucidazione.
un altro piccolo dubbio...
con la funzione visualizzaContatto io scorro tutta la lista, come faccio a ritornare al punto di partenza?
cioé io stampo sempre il successivo, non va modificato?codice:void visualizzaContatto(struct elemento* p) 149 { // visualizzaContatto() - OPEN 150 151 if (p == NULL) 152 { // IF - OPEN 153 154 /* 155 * Se non ci sono contatti lo stampo a video 156 */ 157 system(pulisci); // PULISCE LO SCHERMO 158 printf (" #######################\n"); 159 printf (" # RUBRICA EASY v1.0 #\n"); 160 printf (" #######################\n"); 161 printf (" # VISUALIZZA CONTATTO #\n"); 162 printf (" #######################\n\n"); 163 printf (" Nessun contatto presente\n"); 164 pausa(); 165 166 } else { // ELSE 167 168 /* 169 * Stampo il primo contatto presente 170 */ 171 system(pulisci); // PULISCE LO SCHERMO 172 printf (" #######################\n"); 173 printf (" # RUBRICA EASY v1.0 #\n"); 174 printf (" #######################\n"); 175 printf (" # VISUALIZZA CONTATTO #\n"); 176 printf (" #######################\n\n"); 177 printf (" NOME > %s\n", p->inf.nome); 178 printf (" COGNOME > %s\n", p->inf.cognome); 179 printf (" TELEFONO > %s\n", p->inf.telefono); 180 printf (" EMAIL > %s\n", p->inf.email); 181 printf (" SITOWEB > %s\n", p->inf.sitoweb); 182 pausa(); 183 184 } // IF - CLOSE 185 186 while (p != NULL) 187 { // WHILE - OPEN 188 189 /* 190 * Stampo gli altri contatti 191 */ 192 system(pulisci); // PULISCE LO SCHERMO 193 printf (" #######################\n"); 194 printf (" # RUBRICA EASY v1.0 #\n"); 195 printf (" #######################\n"); 196 printf (" # VISUALIZZA CONTATTO #\n"); 197 printf (" #######################\n\n"); 198 printf (" NOME > %s\n", p->inf.nome); 199 printf (" COGNOME > %s\n", p->inf.cognome); 200 printf (" TELEFONO > %s\n", p->inf.telefono); 201 printf (" EMAIL > %s\n", p->inf.email); 202 printf (" SITOWEB > %s\n", p->inf.sitoweb); 203 pausa(); 204 // Leggo l'elemento successivo 205 p = p->pun; 206 207 } // WHILE - CLOSE 208 209 return; 210 211 } // visualizzaContatto() - CLOSE
const struct elemento *pIniziale=p;
e alla fine quando la funzione ritorna:
p=pIniziale;
C/C++
Ma il programma funziona?
Perchè dalla funzione che hai postato ho capito che la lista non è a doppio senso; non c'è modo di tornare indietro una volta che sei arrivato alla fine.
Praticamente la funzione prende un puntatore e inizia a scorrere finchè la lista non è terminata; il problema è che per forza di cose la funzione ha reso la lista inutilizzabile, in quanto ha reindirizzato il puntatore allo struct verso NULL.
La funzione dovrebbe salvare all'inizio l'indirizzo del primo elemente della lista e alla fine, quando si è arrivati al NULL, rifar puntare il puntatore passato come argomento a questo primo elemento.
O direttamente usare il puntatore argomento solo per inizializzare un'altra variabile puntatore, locale alla funzione.
il programma funzione perchè gli argomenti sono passati per valore e al termine della funzione la testa della lista non è modificata.
Sun Certified Java Programmer
EUCIP Core Level Certified
European Certification of Informatics Professionals
Vero, mi scuso.
Invece il problema della memoria che non viene mai liberata c'è, no?
se non viene liberata è sicuramente un errore perche non bisogna assumere che venga liberata automaticamente.Originariamente inviato da gandalf45
Vero, mi scuso.
Invece il problema della memoria che non viene mai liberata c'è, no?
Sun Certified Java Programmer
EUCIP Core Level Certified
European Certification of Informatics Professionals
aspetta alla funzione visualizzaContatto viene passato un puntatore della struttura lista e non il suo valore! Infatti si usa la sintassi -> per deferenziare.
C/C++