Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Lokale Arrays mit SetLength(0) freigeben oder nicht? (https://www.delphipraxis.net/151031-lokale-arrays-mit-setlength-0-freigeben-oder-nicht.html)

Zacherl 3. Mai 2010 22:44


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

Neutral General 3. Mai 2010 22:49

Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
 
Soweit ich weiß, macht der Memory-Manager das für dich.

himitsu 3. Mai 2010 22:52

Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
 
Hier im Forum suchenSetLength Array freigeben > ein paar Threads sagen es auch nochmal ausführlicher

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.

Zacherl 3. Mai 2010 23:25

Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
 
Ah okay danke euch, dann kann ich mir die ganzen Resourcenschutzblöcke schenken :)

himitsu 4. Mai 2010 06:11

Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
 
Zitat:

Zitat von Zacherl
Ah okay danke euch, dann kann ich mir die ganzen Resourcenschutzblöcke schenken :)

joar ... Delphi baut sich eh ein Try-Finally da mit ein, um seinen Finalisierungscode abzusichern. :stupid:

Muetze1 4. Mai 2010 08:08

Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
 
Zitat:

Zitat von himitsu
Hier im Forum suchenSetLength Array freigeben > ein paar Threads sagen es auch nochmal ausführlicher

Antwort: Nein

Alle Typen, welche Delphi automatisch initialisiert, gibt es auch automatisch frei.

> dyn. Arrays
> Strings
> Interfaces

Bei den Typen im Array trifft das zu, aber nicht für das Array an sich. Das hast du selbst alloziiert und musst es auch selbst freigeben. Dazu entweder nil zuweisen oder mit SetLength() auf 0 setzen.

sirius 4. Mai 2010 08:32

Re: Lokale Arrays mit SetLength(0) freigeben oder nicht?
 
Zitat:

Zitat von Muetze1
Bei den Typen im Array trifft das zu, aber nicht für das Array an sich. Das hast du selbst alloziiert und musst es auch selbst freigeben. Dazu entweder nil zuweisen oder mit SetLength() auf 0 setzen.

So, jetzt haben wir zwei Meinungen (und ein Stuhl :mrgreen:).
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:

himitsu 4. Mai 2010 08:36

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                 //

easywk 4. Mai 2010 08:54

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? :-)

himitsu 4. Mai 2010 09:01

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