Dynamische Arrays
-
- Beiträge: 17
- Registriert: So 7. Jan 2007, 00:09
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Berlin
Dynamische Arrays
Hallo werte Lazarusgemeinde,
eine vielleicht etwas "doofe" Frage: Muss man die dynamischen Arrays nach der Verwendung irgendwie freigeben?
z.B.:
var myIntArray : Array of Integer;
SetLength(myIntArray, 2);
/* Verwendung */
Freigabe von Speicherplatz?
Vielen Dank im Voraus.
eine vielleicht etwas "doofe" Frage: Muss man die dynamischen Arrays nach der Verwendung irgendwie freigeben?
z.B.:
var myIntArray : Array of Integer;
SetLength(myIntArray, 2);
/* Verwendung */
Freigabe von Speicherplatz?
Vielen Dank im Voraus.
-
- Beiträge: 1579
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: Dynamische Arrays
Nein. Strings muss mach ja auch nicht freigeben.
EleLa - Elektronik Lagerverwaltung - www.elela.de
-
- Beiträge: 657
- Registriert: Sa 9. Jan 2010, 17:32
- OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
- CPU-Target: 64Bit
Re: Dynamische Arrays
Arrays sind Reference Counted,
das heißt, dass mitgezählt wird, wie oft sie noch verwendet werden.
Das heißt quasi wiederum, dass du dir keine Sorgen machen musst, das Array freizugeben.
Der Inhalt des Arrays allerdings sollte schon freigegeben werden (Falls du Zeiger speicherst oder so)
das heißt, dass mitgezählt wird, wie oft sie noch verwendet werden.
Das heißt quasi wiederum, dass du dir keine Sorgen machen musst, das Array freizugeben.
Der Inhalt des Arrays allerdings sollte schon freigegeben werden (Falls du Zeiger speicherst oder so)
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Dynamische Arrays
Schaden kann es aber nicht, wenn du alles Frei gibst, was du auch erstellst.
MFG
Michael Springwald
Michael Springwald
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Dynamische Arrays
SetLength(myIntArray, 0) gibt den Speicherplatz komplett frei.Strathmore hat geschrieben:irgendwie freigeben?
-Michael
-
- Beiträge: 351
- Registriert: Di 17. Feb 2009, 10:44
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
Re: Dynamische Arrays
Aus meinem "Jetzt lerne ich Delphi"-Buch entnehme ich:
myIntArray := NIL;
gibt den Speicher wieder frei.
Volker
myIntArray := NIL;
gibt den Speicher wieder frei.
Volker
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: Dynamische Arrays
wenn ich wählen müsste würd ich mschnell's anwort nehmen. bei setlength, wird die länge auf 0 gesetzt. und 0 hat nunmal kein speicher ( kann sein das 4 byte für die länge belegt werden oder so, aber so lange du nich (2 Gigabyte / 4byte) mal einen array of string hast macht das kein problem
die := nil methode würde ich nicht verwenden, da ich eher glaube das das Programm dann einfach den Array zum Speicherleck verwandelt da der Pointer futsch ist.
*test test*
also unter winXP 32bit SP 3 füntionieren doch beide möglichkeiten, ka warum

die := nil methode würde ich nicht verwenden, da ich eher glaube das das Programm dann einfach den Array zum Speicherleck verwandelt da der Pointer futsch ist.
*test test*
also unter winXP 32bit SP 3 füntionieren doch beide möglichkeiten, ka warum

Code: Alles auswählen
var
Form1: TForm1;
anarray:array of string;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
setlength(anarray,1000000);
for i := 0 to high(anarray) do anarray[i] := 'hhhhhhhhhhhhhhhhhhhhhhhhhhhfhsgadkjfashgd';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
setlength(anarray,0);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
anarray := nil;
end;
Code: Alles auswählen
Signatur := nil;
-
- Lazarusforum e. V.
- Beiträge: 3177
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Dynamische Arrays
Was dann das gleiche Ergebnis liefert.ErnstVolker hat geschrieben:Aus meinem "Jetzt lerne ich Delphi"-Buch entnehme ich:
myIntArray := NIL;
gibt den Speicher wieder frei.
Implizite Referenzzählung. Gibt es auch bei Ansistring, Widestring (evtl. vom Widestring-Manager abhängig) und allen Interfaces, die von IUnknown abgeleitet sind. Das heißt, der Compiler überwacht, wann eine Variable dieser Typen einen Wert zugewiesen sind und ruft dann entsprechende Funktionen auf.MAC hat geschrieben:also unter winXP 32bit SP 3 füntionieren beide möglichkeiten, ka warum
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Dynamische Arrays
"Setlegth(dynarray,0)" und "dynarray:= nil" sind in der Wirkung identisch, "dynarray:= nil" ist schneller.MAC hat geschrieben:wenn ich wählen müsste würd ich mschnell's anwort nehmen. bei setlength, wird die länge auf 0 gesetzt. und 0 hat nunmal kein speicher ( kann sein das 4 byte für die länge belegt werden oder so, aber so lange du nich (2 Gigabyte / 4byte) mal einen array of string hast macht das kein problem![]()
die := nil methode würde ich nicht verwenden, da ich eher glaube das das Programm dann einfach den Array zum Speicherleck verwandelt da der Pointer futsch ist.
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Dynamische Arrays
Macht der Compiler das eigentlich beim Kompilieren oder wirkt sich diese Prüfung zur Laufzeit auch auf die Ausführungsgeschwindigkeit aus?carli hat geschrieben:Arrays sind Reference Counted,
das heißt, dass mitgezählt wird, wie oft sie noch verwendet werden.
- Euklid
-
- Beiträge: 17
- Registriert: So 7. Jan 2007, 00:09
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Berlin
Re: Dynamische Arrays
Vielen Dank für Eure ausführliche Antworten!
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Dynamische Arrays
Zur Laufzeit.Euklid hat geschrieben:Macht der Compiler das eigentlich beim Kompilieren oder wirkt sich diese Prüfung zur Laufzeit auch auf die Ausführungsgeschwindigkeit aus?carli hat geschrieben:Arrays sind Reference Counted,
das heißt, dass mitgezählt wird, wie oft sie noch verwendet werden.
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Dynamische Arrays
Ok, danke.
-
- Beiträge: 770
- Registriert: Sa 21. Feb 2009, 13:46
- OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
- CPU-Target: 32Bit
Re: Dynamische Arrays
das weis ich, hab ich auch 2 Zeilen unter korrigiert.mse hat geschrieben: "Setlegth(dynarray,0)" und "dynarray:= nil" sind in der Wirkung identisch

Um wieviel ist denn := nil schneller ?
Code: Alles auswählen
Signatur := nil;
-
- Lazarusforum e. V.
- Beiträge: 3177
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Dynamische Arrays
In Zeit wirst du das nicht messen können, da praktisch jeder Prozessor mit einer anderen Taktfrequenz arbeitet. Dazu unterstützt der FPC auch noch verschieden Prozessorarchitekturen.MAC hat geschrieben:Um wieviel ist denn := nil schneller ?
Du könntest also für eine spezifische Architektur (sagen wir mal x86) die Assembler-Anweisungen analysieren und nach einer Dokumentation suchen, in der steht, wieviele Taktzyklen für diese Befehle gebraucht werden (ich weiß aber nicht, ob das für die gesamte Architektur oder wieder nur für bestimmte Prozessoren gilt).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein