banita21 napisał(a)
w przypadku tablicy obiektow:
tab: array of TKlasa;
skoro kazda instancja klasy jest tak naprawde wskaznikiem wiec zakladam ze nie dziala tu zaden konstruktor domyslny(o ile takowe wystepuja?).
czy po nadaniu tablicy wymiaru musimy w petli przeleciec calosc i wywolac konstruktor dla kazdego elementu?
SetLength(tab,12);
for ...
tab[x] = TKlasa.Create(...); ?
i pozniej analogicznie wywolac Free?
Tak.
Po pierwsze - wskaźnik też zajmuje jakieś miejsce w pamięci.
Po drugie - wskaźnik wskazuje na pewne miejsce w pamięci. A dokładniej rzecz biorąc na pewien obszar, który zajmuje dany obiekt.
Jeśli nie zwolnisz tego obiektu, wskaźnik dalej będzie na tamten obszar wskazywał i będzie on uważany za używany. Dopiero po wywołaniu free* wskaźnik zostaje zdjęty ze stosu, a obszar, na który wskazywał jest uważany za nieużywany i kompilator będzie w tamtym miejscu zapisywał inne rzeczy.
free nie musisz wywoływać jeśli obiekt jest tworzony lokalnie w następujący sposób:
procedure Procedura;
var
myObj: TMyObject;
begin
myObj:=TMyObject.Create;
end;
w tym wypadku obiekt zostanie zwolniony po wyjściu z procedury. Jednak ja dla świętego spokoju zawsze zwalniam ręcznie.