Dynamische Arrays

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Strathmore
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

Beitrag von Strathmore »

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.

MmVisual
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

Beitrag von MmVisual »

Nein. Strings muss mach ja auch nicht freigeben.
EleLa - Elektronik Lagerverwaltung - www.elela.de

carli
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

Beitrag von carli »

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)

pluto
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

Beitrag von pluto »

Schaden kann es aber nicht, wenn du alles Frei gibst, was du auch erstellst.
MFG
Michael Springwald

mschnell
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

Beitrag von mschnell »

Strathmore hat geschrieben:irgendwie freigeben?
SetLength(myIntArray, 0) gibt den Speicherplatz komplett frei.
-Michael

ErnstVolker
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

Beitrag von ErnstVolker »

Aus meinem "Jetzt lerne ich Delphi"-Buch entnehme ich:
myIntArray := NIL;
gibt den Speicher wieder frei.

Volker

MAC
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

Beitrag von MAC »

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 :D
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;

Socke
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

Beitrag von Socke »

ErnstVolker hat geschrieben:Aus meinem "Jetzt lerne ich Delphi"-Buch entnehme ich:
myIntArray := NIL;
gibt den Speicher wieder frei.
Was dann das gleiche Ergebnis liefert.
MAC hat geschrieben:also unter winXP 32bit SP 3 füntionieren beide möglichkeiten, ka warum :)
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.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mse
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

Beitrag von mse »

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 :D
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.
"Setlegth(dynarray,0)" und "dynarray:= nil" sind in der Wirkung identisch, "dynarray:= nil" ist schneller.
Dateianhänge
dynarrayclear.png

Euklid
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

Beitrag von Euklid »

carli hat geschrieben:Arrays sind Reference Counted,
das heißt, dass mitgezählt wird, wie oft sie noch verwendet werden.
Macht der Compiler das eigentlich beim Kompilieren oder wirkt sich diese Prüfung zur Laufzeit auch auf die Ausführungsgeschwindigkeit aus?

- Euklid

Strathmore
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

Beitrag von Strathmore »

Vielen Dank für Eure ausführliche Antworten!

mse
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

Beitrag von mse »

Euklid hat geschrieben:
carli hat geschrieben:Arrays sind Reference Counted,
das heißt, dass mitgezählt wird, wie oft sie noch verwendet werden.
Macht der Compiler das eigentlich beim Kompilieren oder wirkt sich diese Prüfung zur Laufzeit auch auf die Ausführungsgeschwindigkeit aus?
Zur Laufzeit.
Dateianhänge
dynarrayassign.png

Euklid
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

Beitrag von Euklid »

Ok, danke.

MAC
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

Beitrag von MAC »

mse hat geschrieben: "Setlegth(dynarray,0)" und "dynarray:= nil" sind in der Wirkung identisch
das weis ich, hab ich auch 2 Zeilen unter korrigiert. :)
Um wieviel ist denn := nil schneller ?

Code: Alles auswählen

Signatur := nil;

Socke
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

Beitrag von Socke »

MAC hat geschrieben:Um wieviel ist denn := nil schneller ?
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.

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

Antworten