Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
Delphi 12 Athens
|
Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
4. Mai 2010, 09:36
Nee, stimmt schon. dyn Arrays werden automatisch freigegeben.
Delphi initialisiert es quasi mit der Länge 0.
SetLength Reallociert dieses nur.
Delphi-Quellcode:
procedure Test;
var a: array of Integer;
begin
SetLength(a, 1);
end;
Code:
Unit3.pas.27: begin
004A0E24 55 push ebp
004A0E25 8BEC mov ebp,esp
004A0E27 6A00 push $00 // a := nil; aka SetLength(a, 0);
004A0E29 33C0 xor eax,eax // try
004A0E2B 55 push ebp //
004A0E2C 686B0E4A00 push $004a0e6b //
004A0E31 64FF30 push dword ptr fs:[eax] //
004A0E34 648920 mov fs:[eax],esp //
Unit3.pas.28: SetLength(a, 1);
004A0E37 6A01 push $01
004A0E39 8D45FC lea eax,[ebp-$04]
004A0E3C B901000000 mov ecx,$00000001
004A0E41 8B15000E4A00 mov edx,[$004a0e00]
004A0E47 E87C71F6FF call @DynArraySetLength
004A0E4C 83C404 add esp,$04
Unit3.pas.29: end;
004A0E4F 33C0 xor eax,eax
004A0E51 5A pop edx
004A0E52 59 pop ecx
004A0E53 59 pop ecx
004A0E54 648910 mov fs:[eax],edx // finally
004A0E57 68720E4A00 push $004a0e72 //
004A0E5C 8D45FC lea eax,[ebp-$04] //
004A0E5F 8B15000E4A00 mov edx,[$004a0e00] //
004A0E65 E86A71F6FF call @DynArrayClear // SetLength(a, 0);
004A0E6A C3 ret // end;
004A0E6B E91849F6FF jmp @HandleFinally //
004A0E70 EBEA jmp $004a0e5c //
004A0E72 59 pop ecx //
004A0E73 5D pop ebp //
004A0E74 C3 ret //
$2B or not $2B
|
|
Zitat
|