![]() |
Was macht Free genau in einem Array
Abend :wink:
Hab da grad ein Problem - denke wohl eher ein Verständnis-Problem: Und zwar habe ich ein variables Array, das von einem eigenen Typ ist, nehmen wir mal an von Typ TFont. Nun habe ich eine Procedure Add, mit der ich dem Array von mir aus 10 Einträge hinzufüge. Danach will ich den letzten Eintrag löschen und habe bisher das so gemacht:
Delphi-Quellcode:
Mein Gedanke: Mit Free gebe ich den belegten Speicher wieder frei und mit dem setlength verkürze ich das Array. Allerdings bringt mir Delphi bei einer späteren Verwendung des Array ein EA-Fehler, was ich irgendwie nicht ganz versteh: Den das Free gibt auch irgendwie das Array-Feld frei - nur warum?!?! Stimmt meine letzte Annahme überhaupt???
MyArray[9].Free;
setlength(MyArray, length(MyArray) - 1); mfg shark |
Re: Was macht Free genau in einem Array
:gruebel:
Das free gibt nur die Font-Variable frei, die in dem Speicherbereich gespeichert ist. Bei mir läuft alles Glatt:
Delphi-Quellcode:
Es kommt keine Exception.
var
a:array of tfont; i:integer; begin setlength(a,10); for i:=0 to length(a)-1 do a[i]:=tfont.create; a[length(a)-1].Free; setlength(a,length(a)-1); a[5].Size:=10; a[8].Name:='Hallo'; end; Könnte es vllt sein dass du nochmal auf Element [9] zugreifst? |
Re: Was macht Free genau in einem Array
Zitat:
also mit dem Free gibst du definitiv nicht das komplette Array frei, sondern machst genau das was du möchtest (vorrausgesetzt ich hab dich richtig verstanden). Wenn du ein TFont aFont anlegst und an der Stelle 10 ins Array schreibst, dann wird eben aFont freigegeben. Wird die Referenz noch irgendwo im Programm benutzt, so ist diese natürlich genauso freigegeben worden. Wenn du also nach einem solchen Free ein Problem hast, solltest du nochmal kontrollieren, ob du noch irgendwo anders auf das gleiche Element verweist und natürlich auch, dass du nicht über die Grenzen des Arrays hinaus gehst (nach Verminderung). Gruß Der Unwissende |
Re: Was macht Free genau in einem Array
Vielleicht habe ich mich etwas kompliziert ausgedrückt: Und zwar wie schon gesagt habe ich ein Array der Länge 10 und lösche nun z.B. das Fünfte über eine Procedure Delete, die wie folgt aussieht:
Delphi-Quellcode:
Nun ist es allerdings so, dass das Free schon eine Dekrementierung des Arrays bewirkt, was ich allerdings nicht wirklich verstehe...
procedure TMyClass.Delete(Index: Integer);
var i : Integer; begin MyArray[Index].Free; for i := Index to length(MyArray) - 2 do MyArray[i] := MyArray[i + 1]; setlength(MyArray, length(MyArray) - 1); end; PS: Sicherheitsabfragen bei der Procedure habe ich weggelassen. |
Re: Was macht Free genau in einem Array
Es könnte sein, dass die Zuweisung an die leere Speicherstelle nicht klappt. Lass mal das .free weg oder bau in die Schleife noch ein .free ein (jeweils für MyArray[i] bevor du das darrauffolgende zuweist.
Ratte |
Re: Was macht Free genau in einem Array
Zitat:
// Nachtrag: Zitat:
|
Re: Was macht Free genau in einem Array
Könnte es sein das dieser fehler nur dann passiert wenn du das letzte verbleibende element aus dem array löschst?
Das DynArray wird nämlich über ein Interface auf @$00000000 gesetzt wenn alle element entfernt wurden. sprich es wird freigegeben wenn der Referenzzähler 0 erreicht. |
Re: Was macht Free genau in einem Array
@Flocke: stimmt natürlich. Sorry für's Unsinn verbreiten...
Ratte |
Re: Was macht Free genau in einem Array
Zitat:
PS: Kann es eventuell an meiner eigenen Destroy-Procedure liegen?! Die schaut nämlich wie folgt aus:
Delphi-Quellcode:
procedure TMyClass.Destroy;
begin // FSub -> Unterklasse von TMyClass FSub.Free; // FTest -> Variable von Typ TMyClass FTest.Free; inherited Destroy; end; |
Re: Was macht Free genau in einem Array
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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