Newsgroup: it.comp.lang.c++
Titolo: Re: Ancora sugli Alberi

 cancellata, viene posta a zero.
E` difficile pensare che la foglia possa resistere a una delete, cosa
ti fa pensare che non venga cancellata?
Cosa vuol dire "viene posta a zero?
        Mauro

 radice = NULL;        // e non viene cancellata
Forse dipende da come riservi lo spazio per 'radice'. Com'e' che crei
l'albero?
Presumo come array di variabili 'nodo', cosi': nodo * albero = new
nodo[tot].
In questo caso - comunque - devi fare "delete [] radice;" perche' e' un
array.
Ora, "delete [] radice;" rende libero lo spazio in memoria
precedentemente riservato. L'istruzione seguente "radice = NULL;" pone
il puntatore a quell'area di memoria - ancora "valido" diciamo - a zero,
rendendo inservibile l'area che gia' non si puo' piu' usare.
Quindi e' corretto che la foglia venga "messa a zero", sei tu che glielo
dici!
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Mauro
Scusa Mauro ma credo che invece la situazione sia come questa (con le dovute
precisazioni):
#include <iostream>
using std::cout;
void func(int * b) {
    cout << "func: b = " << *b << "\n";
    delete b;
    cout << "func: b = " << *b << "\n";
  }
  int main() {
    int * a = new int(42);
    cout << "main: a = " << *a << "\n";
    func(a);
    cout << "main: a = " << *a << "\n";
  }
che invece va a modificare anche il valore di *a ( "a" dereferenziato ) nel
main ( infatti a me stampa "0" ).
Ma nessuno di questi due casi è quello in oggetto. Se il nodo è costruito
secondo le regole deve avere una variabile per l'informazione e due ( sx e
dx ) altre variabili di tipo *nodo. Se faccio eeguire la delete di un nodo
foglia, il nodo parent che continua ad esistere conterrà sempre una
variabile di tipo puntatore con l'indirizzo del nodo eliminato. Infatti
anche nel precedente programma se stampiamo "a" al posto di "*a" otteniamo
sempre l'indirizzo di memoria a cui "a" punta.
Saluti,
FabioMDF



 


 messa a NULL, e probabilmente il compilatore elimina l'assegnamento.
che ne sai se e' locale? e poi comunque e' un passaggio per puntatore.
Quando fai delete la funzione che la realizza libera solamente l'area di
memoria, a e volte assegna un valore (diverso da zero!) al puntatore.
Quindi e' conveniente, e spesso consigliato, mettere a NULL il
puntatore.


 puntatore.
delete fa due cose:
- distrugge l'oggetto puntato dal puntatore
- libera l'area di memoria
delete non assegna niente, dopo la delete il puntatore rimane in uno
stato non valido.
        Mauro

 stato non valido.
Hai mai fatto un debug su una variabile del genere? Ti dico che il
puntatore cambia valore, almeno sul mio compilatore.



Straquoto perchè hai perfettamente ragione: non ci sarebbe modo di deletare
spazi di memoria assegnati a nodi di liste e alberi se non ci si potesse
riferire alla memoria tramite puntatori passati a funzioni ricorsive che ad
ogni chiamata assegnano al puntatore "current = current->next;" prima di
chiamare se stessa (ricorsivamente).
Ciò non toglie che l'algoritmo di cancellazione nodo, così come è usato da
chi ha iniziato il thread, non è corretto. Ho già avuto modo di spiegare il
problema in altri posts di questo thread ma mi sembra che non sia stato
compreso. Non mi piace ripetermi ma il punto è che non deve cancellare
"radice" quando questo puntatore riferisce il nodo stesso perchè così nel
nodo padre rimane in radice->sx oppure radice->dx un indirizzo di memoria a
nodo cancellato. Questo è anche il motivo per cui quando manda in stampa i
valori di tutti i nodi ottiene un valore "0" nella posizione che era del
nodo cancellato. Quindi per cancellare nel modo opportuno si deve operare la
"delete" al livello del nodo padre di quest'ultimo con:
 delete radice->sx; // oppure delete radice->dx
 radice->sx = 0; // si deve mettere a zero perché, anche se la memoria prec.
indirizzata
      // è stata deletata, il campo puntatore "sx" ne contiene ancora l'indirizzo.
Ciao,
FabioMDF
