![]() |
Array of XY löschen
Hallo Zusammen!
Delphi-Quellcode:
Ist Setlength(A,0) das gleiche wie A:=NIL?Var A : array of byte; begin Setlength(A,1000); Setlength(A,0); A := NIL; end. Mavarik |
AW: Array of XY löschen
Dynamische Array-Variablen sind implizit Zeiger und werden mit derselben Referenzzählung verwaltet wie lange Strings. Um ein dynamisches Array freizugeben, weisen Sie einer Variable, die das Array referenziert, den Wert nil zu, oder Sie übergeben die Variable an Finalize. Beide Methoden geben das Array unter der Voraussetzung frei, dass keine weiteren Referenzen darauf vorhanden sind. Dynamische Arrays werden immer freigegeben, sobald ihr Referenzzähler null ist. Dynamische Arrays der Länge 0 haben immer den Wert nil.
Ja genau das Gleiche. Grüße ;) |
AW: Array of XY löschen
Delphi-Quellcode:
Ausgehend davon, würde ich sagen ja.
var
A : array of Byte; begin SetLength(A, 1000); SetLength(A, 0); Writeln(Assigned(A)); // Liefert: FALSE SetLength(A, 1000); A := nil; Writeln(Assigned(A)); // Liefert: FALSE end. |
AW: Array of XY löschen
Sobald man dem dynamischen Array einen Wert zuweist oder Ihn an SetLength übergibt wird der benötigte Speicher reserviert. Man hat also auch in beiden Fällen keine Speicherlöcher.
|
AW: Array of XY löschen
Danke erstmal..
Aber: Zitat:
Mavarik |
AW: Array of XY löschen
Zitat:
Delphi-Quellcode:
type
TByteArray = array of Byte; Var A, B : TByteArray; begin Setlength(A,1000); B := A; A := NIL; Writeln(Length(B)); end. |
AW: Array of XY löschen
Also eine Referenz kannst du ja immer noch irgendwo gespeichert haben. In diesem Fall einen typisierten Pointer.
Delphi-Quellcode:
Wenn du jetzt:
type
TMyDynArray = array of Integer; PMyDynArray = ^TMyDynArray;
Delphi-Quellcode:
Dann sollte der Array nicht keinen Speicher mehr haben... Sondern erst wenn auch
var
MyDynArray : TMyDynArray; MyDynArrayPointer : PMyDynArray; begin MyDynArrayPointer := MyDynArray; //und dann MyDynArray := Nil;
Delphi-Quellcode:
MyDynArrayPointer := Nil;
MyDynArrayPointer nicht mehr auf die Speicherstelle zeigt sollte der Speicher freigegeben sein. OB das allerdings wirklich so ist ist grade reine Spekulation meinerseits... Da müsste doch vielleicht jemand von den älteren und weiseren einmal was zu sagen ;) Edit: Habe den Code von Herr Raabe ausgetestet. Ja meine Vermutung war richtig. Grüße Edit: Herr Raabe, haben wir hier Referenzzähler im Hintergrund (Stichwort Smartpointer)? |
AW: Array of XY löschen
Delphi-Quellcode:
ist nicht das Gleiche wie
SetLength(A, 0);
Delphi-Quellcode:
, aber es kommt das selbe Ergebnis bei raus.
A := nil;
Delphi-Quellcode:
ruft direkt DynArrayClear auf, wärend SetLength bei 0 an DynArrayClear weiterleitet und sonst was Anderes macht.
:=nil
@Jonas Shinaniganz: Nein, dem ist nicht so, denn "billige" Pointer besitzen keine Referenzzählung. Es werden nur Referenzen der Array-Variablen gezählt. PS: Ihr müßt bei Allem außer den langen Strings aufpassen, mit der Referenzzählung. Es wird für die Freigabe der Daten zwar auf die Referenzzählung geachtet, aber bei Schreibzugriffen hat mein diese Prüfung total vergessen (seit vielen tausend Jahren schon).
Delphi-Quellcode:
var
A, B: array ob Byte; SetLength(A, 3); A[0] := 132; A[1] := 456; A[2] := 798; B := A; B[1] := 963; ShowMessage(IntToStr(A[1])); // hier würde man ja 456 erwarten, aber erhält 963 |
AW: Array of XY löschen
OK...
Nochmal
Delphi-Quellcode:
Speicherbelegung nach der For-Schleife = 0 da jedesmal wenn der "Scope" verlassen wird
Procedure foo;
var A ; Array of Byte begin Setlength(A,100); end; begin for i:=0 to 1000000 do Foo; end; die Referent weg ist und somit auch der Speicher, richtig?
Delphi-Quellcode:
Mavarik
var
A,B ; array of byte begin Setlength(A,3); B := A; // Kopiert den Pointer und nicht den Inhalt, oder? end; |
AW: Array of XY löschen
Ja
und ja, es kopiert den internen Zeiger und zählt die Referenzzählung hoch, also genauso wie beim langen String. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:57 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