Distruttore classe c++

Messaggioda Kroldar » 04/06/2006, 18:19

Premetto che ho creato un progetto c++ fondato su una classe Lista (coi i puntatori) che si basa a sua volta sulla classe ricorsiva Nodo (di cui è friend ovviamente per avere accesso ai membri private)... ho usato i template in modo da avere una lista astratta adattabile a ogni tipo di dato. L'interfaccia della classe Nodo, l'interfaccia della classe Lista e le loro implementazioni (assieme a qualche funzione di utilità che ho dichiarato friend delle due suddette classi) sono sparse su 3 file, mentre nel file main ho messo dei casi di prova con chiamate alle funzioni (inserimento in testa, inserimento in coda, estrazione in testa, estrazione in coda, stampa, inserimento in modo ordinato, verifica se una lista è palindroma...). Ovviamente la classe Lista è dotata di un distruttore (oltre che di un costruttore). Le righe di codice nel main sono molte, ma per effettuare meglio le prove su ogni funzione provvedo di volta in volta a commentare le righe che al momento non interessano... il problema è che quando assemblo il progetto e lancio l'esegubile, al termine dell'esecuzione in alcuni casi mi compare il messaggio incluso nel distruttore che informa della distruzione dei nodi effettuata, in altri casi invece quel messaggio non mi compare...
Dunque a volte non viene invocato il distruttore? Se così fosse ci sarebbe uno spreco di memoria... Vorrei capire come stanno le cose e soprattutto perché a volte il distruttore non viene invocato, credevo fosse automatica la sua invocazione prima del termine del programma. Grazie a chi saprà darmi una spiegazione.
Kroldar
Advanced Member
Advanced Member
 
Messaggio: 384 di 2110
Iscritto il: 11/11/2005, 16:23

Messaggioda luca.barletta » 04/06/2006, 20:04

Nonostante sia un po' arrugginito su queste cose tento di darti una risposta, ma prendila con senso critico: il costruttore viene sicuramente chiamato dopo un'istruzione del tipo delete. Non è detto che venga chiamato prima della fine del programma, dovrebbe dipendere dal compilatore e dalle opzioni di uso di questo.
Avatar utente
luca.barletta
Moderatore globale
Moderatore globale
 
Messaggio: 141 di 4341
Iscritto il: 21/10/2002, 20:09

Messaggioda Kroldar » 04/06/2006, 20:33

scusa luca, non mi è chiaro cosa intendi... tra l'altro l'istruzione delete è contenuta nell'implementazione del distruttore, se non viene invocato il distruttore allora l'istruzione delete non può agire. ti porto un esempio: ho fatto una funzione membro che mette gli elementi inseriti in testa alla lista e un'altra che stampa... va tutto ok ma alla fine dopo aver stampato la lista il programma termina senza distruggere niente (esce soltanto il messaggio "premere un tasto per continuare" avendo inserito system pause nel main); viceversa se invoco la funzione che controlla se una lista è palindroma, alla fine del programma esce il messaggio "tutti i nodi sono stati distrutti" e poi il consueto "premere un tasto per continuare"
Kroldar
Advanced Member
Advanced Member
 
Messaggio: 385 di 2110
Iscritto il: 11/11/2005, 16:23

Messaggioda Kroldar » 04/06/2006, 20:52

tutto risolto!! è molto semplice la soluzione... il distruttore viene invocato quando si esce fuori dallo scope... bene lo scope nel mio caso terminava con la parentesi graffa del main, ovvero dopo il "system pause" e quindi è normale che non mi comparisse il messaggio di distruzione avvenuta prima della chiusura della console. per ovviare e farlo comparire basta racchiudere le istruzioni contenute nel main (ad eccezione di "return 0" e "system pause") tra altre due parentesi graffe.
luca ti ringrazio lo stesso per l'interesse.
Kroldar
Advanced Member
Advanced Member
 
Messaggio: 386 di 2110
Iscritto il: 11/11/2005, 16:23

Messaggioda luca.barletta » 04/06/2006, 21:01

figurati, mi è servito per togliermi un po' la ruggine di dosso
Avatar utente
luca.barletta
Moderatore globale
Moderatore globale
 
Messaggio: 145 di 4341
Iscritto il: 21/10/2002, 20:09


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite