Salve,
vorrei sapere un vostro parere in merito ad una questione .

Ho creato due classi del tipo

codice:
	type 
		TIndirizzo = class
			constructor
				create;
			private
				nome:string;
				cognome:string;
				citta:string;
				via:string;
				cap:string;
			protected
				procedure leggi(info:string);
			public
				property getnome: string read nome;
				property getcognome: string read cognome;
				property getcitta: string read citta;
				property getvia: string read citta;
				property getcap: string read citta;
			end;
			
			TlistaIndirizzi = class
				constructor create(nf:string);
				private
					indirizzi: array of TIniridzzo;
				public
					procedure get_indirizzo(nome:string;cognome:string):TIndirizzo;
				end;
		
		....
	implementation
		procedure Tindirizzi.leggi(info:string);
		begin
			nome:=copy(info,1,10);
			nome:=copy(info,20,10);
			cognome:=copy(info,30,10);
			citta:=copy(info,40,10);
			via:=copy(info,50,10);
			cap:=copy(info,60,10);
		end;
		..
		procedure TListaIndirizzi.create(nf);
		var
			t:textFile;
			i:integer;
			riga:string;
		begin
			i:=0;
			assignFile(t,nf);
			reset(t);
			while not eof(t) do
			begin
				readln(t,riga);
				SetLength(indirizzi,i+1);
				indirizzi[i]:=TIndirizzo.create;
				indirizzi[i].leggi(riga);
				inc(i);
			end;
			closeFile(t);
		end;
		...
		var 
			ListaInd:TlistaIndirizzi;
			indirizzo:Tindirizzo;
Se io eseguo il codice sottostante

codice:
	...
		indirizzo:=Tindirizzo.create;
		ListaInd:=TlistaIndirizzi.create('indirizzi.txt');
		indirizzo:=ListaInd.get_indirizzo('Mario','Rossi');
		showmessage(indirizzo.getcitta);
		indirizzo.free;		
	...
Ottengo che il metodo free non solo cancella la variabile "indirizzo" ma anche "ListaInd.indirizzi[i]"!
Questo mi fa pensare che ad "indirizzo" non venga passato il valore di ListaInd.indirizzi[i], ma l'indirizzo di memoria come se fosse un puntatore.. ma perchè? è normale?

P.S.
Il codice è un esempio semplificato di quello che fa la mia classe, non è il codice reale!