Forse non mi sono spiegato bene, probabilmente perchè manca la funzione "get_indirizzo":Originariamente inviato da alka
Cosa intendi con "cancellare"? Il metodo Free distrugge l'oggetto, pertanto qualsiasi riferimento a esso non sarà più valido perché questo non esiste più in memoria (ciò si tradurrà quindi in una probabile Access Violation).
Il codice mi sembra abbastanza caotico, ad ogni modo è sufficiente sapere che quando si crea una istanza di una classe (oggetto), cioè di cui si dispone è il "riferimento" a quell'oggetto, cioè un "puntatore". Andando a richiamare il metodo Free, si distrugge l'oggetto in questione attraverso il suo riferimento, pertanto qualsiasi altro riferimento presente in variabili, campi, array o altre strutture dati non sarà più "valido" (avrà cioè un puntatore valido - non nil - ma che si riferisce a un oggetto che non esiste più).
P.S.: suggerisco di usare titoli più significativi per i problemi (tralasciando il fatto che non è affatto un bug ciò che è alla base della programmazione a oggetti).![]()
Tornando al codice in esame:codice:function TlistaIndirizzi.get_indirizzo(nome,cognome:string):Tindirizzo; var i:integer; begin result:=nil; for i:=0 to count(indirizzi)-1 do begin if (indirizz[i].nome=nome) and (indirizz[i].cognome=cognome) then begin result:=indirizz[i]; break; end; end; end;
quando faccio il free non solo mi libera la variabile "indirizzo" ma anche quella dal quale ha copiato il valore cioè quella di "ListaInd.indirizzi[i]" (risultato della funzione get_indirizzo), come se ad "indirizzo" non gli avesse assegnato solo il valore della variabile "ListaInd.indirizzi[i]", ma proprio l'indirizzo di memoria.. ma io non ho usato un puntatore.. ecco dov'è la mia perplessità e chiedevo se fosse normale o se fosse un bug!!codice:indirizzo:=Tindirizzo.create; ListaInd:=TlistaIndirizzi.create('indirizzi.txt'); indirizzo:=ListaInd.get_indirizzo('Mario','Rossi'); showmessage(indirizzo.getcitta); indirizzo.free;
Siccome mi sono confrontato con i miei colleghi qui in ufficio su questo argomento e mi dicevano che nella variabile "indirizzo" dovrebbe esser copiato solo il valore del risultato della funzione "get_indirizzo" e non l'indirizzo chiedevo se fossimo tutti in errore o se a sbagliare fosse il compilatore..
Tu dici bene
quando si crea una istanza di una classe (oggetto), cioè di cui si dispone è il "riferimento" a quell'oggetto, cioè un "puntatore"
Ma qui io ho due istanze diverse, "indirizzo" ed il risultato di "ListaInd.get_indirizzo('Mario','Rossi')".. perché se libero la prima istanza mi dovrebbe liberare anche la seconda? E' normale? e se io volessi che in indirizzo venisse copiato solo il valore risultato della funzione?
p.s: ottimo titolo, sinceramente non sapevo cosa scriverci!!


Rispondi quotando