AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Lokale Arrays mit SetLength(0) freigeben oder nicht?
Thema durchsuchen
Ansicht
Themen-Optionen

Lokale Arrays mit SetLength(0) freigeben oder nicht?

Ein Thema von Zacherl · begonnen am 3. Mai 2010 · letzter Beitrag vom 4. Mai 2010
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Lokale Arrays mit SetLength(0) freigeben oder nicht?

  Alt 3. Mai 2010, 23:44
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

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

  Alt 3. Mai 2010, 23:49
Soweit ich weiß, macht der Memory-Manager das für dich.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 3. Mai 2010, 23:52
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

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

  Alt 4. Mai 2010, 00:25
Ah okay danke euch, dann kann ich mir die ganzen Resourcenschutzblöcke schenken
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 4. Mai 2010, 07:11
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

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

  Alt 4. Mai 2010, 09:08
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 4. Mai 2010, 09:32
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 ).
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
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 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                 //
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
easywk

Registriert seit: 9. Jul 2003
Ort: Schwanewede
117 Beiträge
 
Delphi 7 Enterprise
 
#9

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

  Alt 4. Mai 2010, 09:54
wobei es sicherlich nicht schädlich ist, wenn man selber ein SetLength(0) einfügt, oder?
Björn
if all else fails - read the instructions
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 4. Mai 2010, 10:01
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz