AGB  ·  Datenschutz  ·  Impressum  







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

free erzeugt Fehler

Ein Thema von fui-tak · begonnen am 11. Jul 2010 · letzter Beitrag vom 12. Jul 2010
Antwort Antwort
Seite 1 von 2  1 2      
fui-tak

Registriert seit: 24. Okt 2008
117 Beiträge
 
Turbo Delphi für Win32
 
#1

free erzeugt Fehler

  Alt 11. Jul 2010, 14:24
Hallo zusammen,
ich habe da ein Problem mit der free Methode:


Delphi-Quellcode:
...
levels[3] := levels[1];
...



destructor TSpielverwalter.Destroy;
var i: integer;
begin

  for i := 0 to high(levels) do
     levels[i].free;


  inherited;
end;

Wenn die Schleife jetzt bei 3 ankommt, gibt's einen Fehler, nämlich "Erste Gelegenheit für Exception bei $758EB727. Exception-Klasse EInvalidPointer mit Meldung 'Ungültige Zeigeroperation'. Prozess SpielOGLProject1.exe (972)"


Das ganze passiert, weil der Speicherplatz schon bei levels[1] feigegeben wird; das habe ich verstanden, nur habe ich keine Idee, wie ich das Problem ordentlich umgehen könnte
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: free erzeugt Fehler

  Alt 11. Jul 2010, 14:26
Beim Löschen immer von Hinten, denn mit jedem Löschen, wird die Anzahl der Elemente ja kleiner
Delphi-Quellcode:
for i := high(levels) to low(level) do
     levels[i].free;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 10. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#3

AW: free erzeugt Fehler

  Alt 11. Jul 2010, 14:30
Er löscht ja nicht, er gibt ja nur frei.

Versuchs mal mit FreeAndNil(levels[i]) und prüfe davor auf Assigned(levels[i]).
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#4

AW: free erzeugt Fehler

  Alt 11. Jul 2010, 14:32
Free prüft auch ob die Klasse <> NIL ist
Lars
  Mit Zitat antworten Zitat
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 10. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#5

AW: free erzeugt Fehler

  Alt 11. Jul 2010, 14:48
Ja, Free setzt aber nichts auf nil.

Mir ist aber gerade aufgefallen, dass das gar nichts mit dem Problem zu tun hat.
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#6

AW: free erzeugt Fehler

  Alt 11. Jul 2010, 14:49
Ging ja auch nur um das assigned()..
Lars
  Mit Zitat antworten Zitat
fui-tak

Registriert seit: 24. Okt 2008
117 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: free erzeugt Fehler

  Alt 11. Jul 2010, 14:58
Eure Vorschläge funktionieren alle leider nicht:

Erster Versuch:
Delphi-Quellcode:
for i := 0 to high(levels) do
  if Assigned(levels[i]) then
     FreeAndNil(levels[i]);


Dieser Code gibt zwar keinen Fehler aus, aber die Schleife wird auch nur einmal durchgegangen
Delphi-Quellcode:
for i := high(levels) to low(levels) do
  levels[i].free;


Hier gibt's dann wieder einen Fehler
Delphi-Quellcode:
for i := high(levels) downto low(levels) do
  levels[i].free;
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#8

AW: free erzeugt Fehler

  Alt 11. Jul 2010, 15:04
Ansonsten bastel dir eine Assign Methode, um alle Eigenschaften in das Level zu kopieren. Dann kannst du diese Klassen so freigeben. Beispiel:

Delphi-Quellcode:
level[0]:=TLevel.create;
level[0].Assign(level[1]);


procedure TLevel.Assign(ASOurce:TPersistent);
begin if (ASource is TLevel) then
         Self.Name := (ASOurce as TLevel).Name; //für alle attribute machen
      else
         inherited Assign(ASOurce);
end;
Du musst dann TLevel von TPersistent ableiten
Lars
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

AW: free erzeugt Fehler

  Alt 11. Jul 2010, 15:08
Moin,
naja der Fehler ist ja klar: Es wird vorher schon bereits ein weiter hinten liegendes Element gelöscht. Da hilft dann FreeAndNil() auch wenig, da nicht der hinten liegende Zeiger genilt wird (oder liege ich da falsch).

Deshalb würde ich in diesem Fall echt assign verwenden!

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: free erzeugt Fehler

  Alt 11. Jul 2010, 16:47
Eine andere Möglichkeit sehe ich auch nicht, da level[3] ja nicht mitbekommt, wenn level[1] freigegeben wird, egal ob mit Free oder FreeAndNil. Ansonsten müsste man ja irgendwo hinterlegen, wo überall gleiche Instanzverweise existieren und diese dann beim Freigeben alle nullen, aber das halte ich für ein sehr gefährliches und fehleranfälliges Unterfangen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:20 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