AGB  ·  Datenschutz  ·  Impressum  







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

Was macht Free genau in einem Array

Ein Thema von s.h.a.r.k · begonnen am 8. Dez 2005 · letzter Beitrag vom 12. Dez 2005
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

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

Was macht Free genau in einem Array

  Alt 8. Dez 2005, 16:40
Abend

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:
MyArray[9].Free;
setlength(MyArray, length(MyArray) - 1);
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???

mfg shark
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Was macht Free genau in einem Array

  Alt 8. Dez 2005, 17:00


Das free gibt nur die Font-Variable frei, die in dem Speicherbereich gespeichert ist. Bei mir läuft alles Glatt:

Delphi-Quellcode:
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;
Es kommt keine Exception.

Könnte es vllt sein dass du nochmal auf Element [9] zugreifst?
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#3

Re: Was macht Free genau in einem Array

  Alt 8. Dez 2005, 17:01
Zitat von s.h.a.r.k:
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???
Hi,
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
  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
 
#4

Re: Was macht Free genau in einem Array

  Alt 8. Dez 2005, 17:08
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:
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;
Nun ist es allerdings so, dass das Free schon eine Dekrementierung des Arrays bewirkt, was ich allerdings nicht wirklich verstehe...

PS: Sicherheitsabfragen bei der Procedure habe ich weggelassen.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Ratte

Registriert seit: 12. Dez 2003
Ort: Erfurt
345 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Was macht Free genau in einem Array

  Alt 8. Dez 2005, 17:43
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
Schiffsratte der U.S.S. Delphipraxis, Laderaum 4538
BUSH:= TTerminator.create;
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: Was macht Free genau in einem Array

  Alt 8. Dez 2005, 17:53
Zitat von s.h.a.r.k:
Nun ist es allerdings so, dass das Free schon eine Dekrementierung des Arrays bewirkt, was ich allerdings nicht wirklich verstehe...
Das wäre nur dann der Fall, wenn deine Klasse so `schlau´ wäre, sich im Destruktor selbst aus der Liste zu löschen.

// Nachtrag:

Zitat von Ratte:
Lass mal das .free weg oder bau in die Schleife noch ein .free ein (jeweils für MyArray[i] bevor du das darrauffolgende zuweist.
Das ist Unsinn, weil er MyArray[i] ja vorher an MyArray[i - 1] zugewiesen hat.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.926 Beiträge
 
Delphi 12 Athens
 
#7

Re: Was macht Free genau in einem Array

  Alt 8. Dez 2005, 18:00
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.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Ratte

Registriert seit: 12. Dez 2003
Ort: Erfurt
345 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Was macht Free genau in einem Array

  Alt 8. Dez 2005, 18:04
@Flocke: stimmt natürlich. Sorry für's Unsinn verbreiten...

Ratte
Schiffsratte der U.S.S. Delphipraxis, Laderaum 4538
BUSH:= TTerminator.create;
  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
 
#9

Re: Was macht Free genau in einem Array

  Alt 9. Dez 2005, 09:29
Zitat von QuickAndDirty:
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.
Hm... nein, eben das nicht. Wenn ich das letzte lösche tritt da nie der Fehler auf, was ich allerdings etwas seltsam finde... daher verstehe ich auch nicht ganz warum es nicht klappen will.


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;
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#10

Re: Was macht Free genau in einem Array

  Alt 9. Dez 2005, 09:59
Zitat von s.h.a.r.k:
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:
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;
Nun ist es allerdings so, dass das Free schon eine Dekrementierung des Arrays bewirkt, was ich allerdings nicht wirklich verstehe...

PS: Sicherheitsabfragen bei der Procedure habe ich weggelassen.
Beim löschen eines Feldes Deines Arrays solltest du die schleife auf jeden Fall rückwärts(downto) laufen lassen.
Mario
MSN: cyanide@ccode.de
  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 03:24 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