Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Array of XY löschen (https://www.delphipraxis.net/170038-array-xy-loeschen.html)

Mavarik 27. Aug 2012 14:30

Array of XY löschen
 
Hallo Zusammen!

Delphi-Quellcode:

Var

   A : array of byte;

begin
  Setlength(A,1000);

  Setlength(A,0);
  A := NIL;
end.
Ist Setlength(A,0) das gleiche wie A:=NIL?

Mavarik

Jonas Shinaniganz 27. Aug 2012 14:35

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 ;)

s.h.a.r.k 27. Aug 2012 14:36

AW: Array of XY löschen
 
Delphi-Quellcode:
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.
Ausgehend davon, würde ich sagen ja.

Jonas Shinaniganz 27. Aug 2012 14:43

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.

Mavarik 27. Aug 2012 14:50

AW: Array of XY löschen
 
Danke erstmal..

Aber:

Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1180125)
Beide Methoden geben das Array unter der Voraussetzung frei, dass keine weiteren Referenzen darauf vorhanden sind.

Bedeutet? Was könnte den noch eine Referenz habe?

Mavarik

Uwe Raabe 27. Aug 2012 14:55

AW: Array of XY löschen
 
Zitat:

Zitat von Mavarik (Beitrag 1180130)
Danke erstmal..

Aber:

Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1180125)
Beide Methoden geben das Array unter der Voraussetzung frei, dass keine weiteren Referenzen darauf vorhanden sind.

Bedeutet? Was könnte den noch eine Referenz habe?

Mavarik

Delphi-Quellcode:
type
  TByteArray = array of Byte;

Var
   A, B : TByteArray;

begin
  Setlength(A,1000);
  B := A;
  A := NIL;
  Writeln(Length(B));
end.

Jonas Shinaniganz 27. Aug 2012 14:59

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:
type
  TMyDynArray = array of Integer;
  PMyDynArray = ^TMyDynArray;
Wenn du jetzt:

Delphi-Quellcode:
var
  MyDynArray : TMyDynArray;
  MyDynArrayPointer : PMyDynArray;

begin
  MyDynArrayPointer := MyDynArray;
//und dann
  MyDynArray := Nil;
Dann sollte der Array nicht keinen Speicher mehr haben... Sondern erst wenn auch


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

himitsu 27. Aug 2012 15:05

AW: Array of XY löschen
 
Delphi-Quellcode:
SetLength(A, 0);
ist nicht das Gleiche wie
Delphi-Quellcode:
A := nil;
, aber es kommt das selbe Ergebnis bei raus.

Delphi-Quellcode:
:=nil
ruft direkt DynArrayClear auf, wärend SetLength bei 0 an DynArrayClear weiterleitet und sonst was Anderes macht.

@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

Mavarik 27. Aug 2012 15:37

AW: Array of XY löschen
 
OK...

Nochmal

Delphi-Quellcode:
Procedure foo;
var
  A ; Array of Byte
begin
  Setlength(A,100);
end;

begin
  for i:=0 to 1000000 do
    Foo;
end;
Speicherbelegung nach der For-Schleife = 0 da jedesmal wenn der "Scope" verlassen wird
die Referent weg ist und somit auch der Speicher, richtig?

Delphi-Quellcode:
var
  A,B ; array of byte
begin
  Setlength(A,3);

  B := A; // Kopiert den Pointer und nicht den Inhalt, oder?
end;
Mavarik

himitsu 27. Aug 2012 15:39

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 08:45 Uhr.
Seite 1 von 3  1 23      

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