AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array of XY löschen

Ein Thema von Mavarik · begonnen am 27. Aug 2012 · letzter Beitrag vom 28. Aug 2012
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#1

Array of XY löschen

  Alt 27. Aug 2012, 15:30
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
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#2

AW: Array of XY löschen

  Alt 27. Aug 2012, 15:35
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
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Array of XY löschen

  Alt 27. Aug 2012, 15:36
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#4

AW: Array of XY löschen

  Alt 27. Aug 2012, 15:43
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.
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Array of XY löschen

  Alt 27. Aug 2012, 15:50
Danke erstmal..

Aber:

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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: Array of XY löschen

  Alt 27. Aug 2012, 15:55
Danke erstmal..

Aber:

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#7

AW: Array of XY löschen

  Alt 27. Aug 2012, 15:59
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


  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)?
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!

Geändert von Jonas Shinaniganz (27. Aug 2012 um 16:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Array of XY löschen

  Alt 27. Aug 2012, 16:05
SetLength(A, 0); ist nicht das Gleiche wie A := nil; , aber es kommt das selbe Ergebnis bei raus.

:=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
$2B or not $2B

Geändert von himitsu (27. Aug 2012 um 16:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Array of XY löschen

  Alt 27. Aug 2012, 16:37
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Array of XY löschen

  Alt 27. Aug 2012, 16:39
Ja

und ja, es kopiert den internen Zeiger und zählt die Referenzzählung hoch, also genauso wie beim langen String.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 14:23 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