Niels (niLLer) wrote in message <3a202e65.23253606@news.12move.dk>...
>Just as I expected, "David A. D. Konrad" <konrad@dadk.dk> came up with
>this:
>
>>>Ok, man kan sikkert godt droppe try..finally blokken, men det jeg mest
>>>tænkte på var faktisk "T.Free" linien! Det er jo ikke så smart at lave
>>>rod i rammen!
>>
>>Nej, men det er jo en lokal variabel.
>
>BLiver den så automatisk free'et? Det har jeg aldrig hørt om før!
Sådan har jeg altid opfattet det. Når der hoppes ud af proceduren tælles der
jo ned i stakken. Se dette
procedure CreateDummyList;
var T:TStringList;
count:integer;
begin
T:=TStringList.create;
for count:=0 to 100 do T.add('qwertqwertyqwertyqwertyqwerty');
end;
procedure TForm1.Button2Click(Sender: TObject);
var count: integer;
begin
for count:=1 to 1000 do CreateDummyList;
end;
Hvis nu vi indfører følgende
procedure TForm1.Button2Click(Sender: TObject);
var count: integer;
TMS : TMemoryStatus;
begin
TMS.dwLength := SizeOf(TMS);
GlobalMemoryStatus(TMS);
messagedlg('Brugt memory
:'+inttostr(TMS.dwMemoryLoad),mtInformation,[mbOk],0);
for count:=1 to 1000 do CreateDummyList;
GlobalMemoryStatus(TMS);
messagedlg('Brugt memory
:'+inttostr(TMS.dwMemoryLoad),mtInformation,[mbOk],0);
end;
Vil det ganske vist se ud som om der bruges en masse hukommelse. Hvis du
derimod skriver
procedure CreateDummyList;
var T:TStringList;
count:integer;
begin
T:=TStringList.create;
for count:=0 to 100 do T.add('qwertqwertyqwertyqwertyqwerty');
T.free;
end;
Bliver der ikke brugt noget hukommelse, men hvis du placerer
"hokummelsescheckeren" i en anden procedure sådan her
procedure TForm1.Button3Click(Sender: TObject);
var TMS : TMemoryStatus;
begin
TMS.dwLength := SizeOf(TMS);
GlobalMemoryStatus(TMS);
messagedlg('Brugt memory
:'+inttostr(TMS.dwMemoryLoad),mtInformation,[mbOk],0);
end;
og fjerner T.free, Vil det i alle tilfælde kunne ses, at der før og efter
man har eksekveret Button2Click ikke er forskel på brugen af hukommelse.
Dette tolker jeg som at lokale variabler automatisk fjernes fra hokummelsen
når man hopper ud af den og stack-pointeren flyttes tilbage til forrige
programdel...Men de bliver ikke freet som normalt, men simptlhen blot
fjernet fra det lokale adresseområde de lokale variabler benyttede.
hilsen,