Newsgroup: it.comp.lang.c
Titolo: Secondo voi questa funzione...II tempo

Salve a tutto il NG.
Ho un problema da risolvere immediatamente....e non riesco a capire cosa non
va nel mio sorgente:
Giorni fa avevo chiesto se la seguente funzione era corretta, come
pensavo....e tutti mi avete detto di si...ma
purtroppo non funziona come dovrebbe funzionare.....
Allora dopo aver allocato un albero binario puntato da p lo voglio
deallocare invocando la funzione
liberamemoria(p);
void liberamemoria(expr *p)
{
 if (p)
 {
  liberamemoria(p->left);
  liberamemoria(p->right);
  free(p);
 }
}
e pensavo la deallocasse invece se faccio cosi'
printf ("\n%s",p->right->tipo.n);
  getch();
il programma ovviamente mi stampa X ed e' corretto.
Poi voglio eliminare dalla faccia della terra tutto l'albero e mando un
 liberamemoria(p);
Ma subito dopo se faccio di nuovo:
  printf ("\n%s",p->right->tipo.n);
  getch();
Mi riappare X...di nuovo....praticamente non mi dealloca niente.......
Il sospetto l'ho avuto perche' deallocando tante volte alla fine mi e'
apparso il messaggio MEMORIA INSUFFICIENTE....che era un else di una mia
malloc...
Secondo voi che cosa devo fare....c'e' chi mi ha consigliato di passare
l'indirizzo del puntatore alla funzione...ma secondo me non ha molto
senso...
Vi prego aiutatemi....la cosa e' tragica....
Ringrazio tutti anticipatamente...
euterpex & Paolo Pino

 Mi riappare X...di nuovo....praticamente non mi dealloca niente.......
Non e' molto strano che riappare, deallocare non vuol dire che i puntatori
vengono puoi messi a zero. Finche' non c'e' nessun altro programma (o il tuo
processo stesso) a sovvrascrivere il heap i valori saranno sempre
accessibili.
Problemi con malloc possono succedere se l'ordine e le dimensioni dei
malloc/free sono un po incasinati (deframentazione della memoria). Prova sul
tuo sistema a trovare una funzione tipo heapcheck, magari ti dira' qualcosa
in piu. Ci sono anche sistemi con un bug nella gestione della memoria....

 Mi riappare X...di nuovo....praticamente non mi dealloca niente.......
E`  normale. free()  si limita  a segnare  quel blocco  di memoria  come
disponibile per  altre allocazioni,  non ne azzera  il contenuto. Quello
che  stai  facendo  (ie.  accesso  a  memoria  non  allocata)  cade  nel
"undefined  behaviour". Il   tuo  programma  casualmente   funziona,  ma
potrebbe anche  andare in  crash o  fare esplodere  il pc...  
ho  sentito anche  storie  di  strani demoni  che  escono  dal naso  del
programmatore... mah...
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Sono un mirabile incrocio tra Tarzan e Giacomo Leopardi.
In me convivono tutte le doti intelluttuali di Tarzan e
tutta la prestanza fisica di Giacomo Leopardi.
A. Borsani

programmatore... mah...
eh eh, ma non penso siano dovute all'utilizzo della funzione...ma
piuttosto alle ore "buttate" davanti al pc che si blocca ogni 3x2
--
Rhymes
--------------------------
rhy...@myself.com
http://www.foxhound-games.it
http://embyte.mascanc.net
--------------------------
Linux User #219707

 Vi prego aiutatemi....la cosa e' tragica....
In effetti la procedura non è molto corretta, perchè pur deallocando la
memoria, la struttura resta; cioè  quando viene incontrata una foglia,
prima di deallocarala, dovresti annullare il puntatore del nodo
precedente che punta ad essa, in modo tale che al passaggio successivo
il puntatore venga letto come NULL.
Cecco

il puntatore venga letto come NULL.
Passaggio successivo ? Quale passaggio successivo ?
Se quella struttura e' un albero binario (ovvero se non ci sono
cicli) allora quella funzione e' secondo me assolutamente corretta.
Chiaro che quando si fa la free di un blocco non ci si deve
aspettare che il blocco venga sovrascritto (anche se nei miei
allocatori di debug e' qualcosa che faccio -- per scoprire il
prima possibile quando una struttura gia' deallocata viene
di nuovo utilizzata in lettura).
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff