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).
Forse non mi sono spiegato bene, probabilmente perchè manca la funzione "get_indirizzo":

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;
Tornando al codice in esame:

codice:
indirizzo:=Tindirizzo.create;
ListaInd:=TlistaIndirizzi.create('indirizzi.txt');
indirizzo:=ListaInd.get_indirizzo('Mario','Rossi');
showmessage(indirizzo.getcitta);
indirizzo.free;
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!!
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!!