![]() |
Lokale Arrays mit SetLength(0) freigeben oder nicht?
Hey,
ich stelle mir grade die Frage, ob ich ein dynamisches Array, welches ich als lokale Variable deklariert habe von Hand wieder mit SetLength(0) freigeben muss, oder ob Delphis Memory Manager diese Arbeit für mich erledigt. Weiß da jemand bescheid? Viele Grüße Zacherl |
Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
Soweit ich weiß, macht der Memory-Manager das für dich.
|
Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
![]() Antwort: Nein Alle Typen, welche Delphi automatisch initialisiert, gibt es auch automatisch frei. > dyn. Arrays > Strings > Interfaces [edit] Nein, der Memory-Manager ist nicht dafür zuständig. Die Compilermagic fügt automatisch einen passenden Initialisierungscode quasi in das BEGIN der Funktionen und einen Finalisierungscode in das END ein, welcher dann z.B. den Speicher freigibt. |
Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
Ah okay danke euch, dann kann ich mir die ganzen Resourcenschutzblöcke schenken :)
|
Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
Zitat:
|
Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
Zitat:
|
Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
Zitat:
Stimmen wir jetzt ab, was richtig ist, oder sollten wir es besser nachprüfen? Ich würde sagen, wir prüfen es nach. Und da ich dies schon längst getan habe und himi wahrscheinlich auch, weis ich was richtig ist :stupid: |
Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
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 // |
Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
wobei es sicherlich nicht schädlich ist, wenn man selber ein SetLength(0) einfügt, oder? :-)
|
Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
Abgesehn von "unnützem" Code und somit ein paar Bytes und Nanosekunden Rechenzeit mehr
ist es nicht schädlich. Also wer es unbedingt selber freigeben will, der kann es ruhig machen. :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz