![]() |
Freigeben einer Pointerstruktur
Hi,
ich muss sagen das ist das erste mal das ich großartig mit Zeigern in Delphi arbeite, darum auch hier gleich eine Frage, zu der ich nach langem suchen auch keine antwort habe. Ich habe die Folgende Pointerstruktur:
Delphi-Quellcode:
und habe auf einen Button eine ganz kleine Teststruktur angelegt:
PCommands = ^TCommands;
TCommands = record KeyInput : Boolean; Input : TInputType; Parameter : String; Next : PCommands; end; PMakro = ^TMakro; TMakro = record TimeStamp : Integer; Commands : PCommands; Next : PMakro; end;
Delphi-Quellcode:
und wollte testen, ob meine Freigabefunktionen funktionieren, sie arbeiten rekursiv und sollen eigentlich die listen von hinten nach vorne zerstören:
procedure TForm1.Button4Click(Sender: TObject);
var Anchor : PMakro; begin new (Anchor); Anchor^.TimeStamp := 10; new (Anchor^.Commands); Anchor^.Commands^.KeyInput := True; FreeMakro (Anchor); end;
Delphi-Quellcode:
ich hab markiert wo ich eine AV bekomme, kann mir einer sagen was ich falsch gemacht habe?
procedure TForm1.FreeMakro (Anchor : PMakro);
begin if Assigned (Anchor) then begin if Assigned (Anchor.Commands) then FreeCommands (Anchor.Commands); if Assigned (Anchor.Next) then FreeMakro (Anchor.Next); dispose (Anchor); end; end; procedure TForm1.FreeCommands (Anchor : PCommands); begin if Assigned (Anchor) then begin if Assigned (Anchor.Next) then FreeCommands (Anchor^.Next); // <---- HIER WIRD EINE AV AUSGELÖST dispose (Anchor); end; end; Danke schonmal MfG Hybrid666 |
Re: Freigeben einer Pointerstruktur
Wenn Du eine Struktur erzeugst, dann solltest Du die NEXT Felder in deinem Beispiel auf nil setzen. Sonst zeigen sie irgendwo hin.
Uli |
Re: Freigeben einer Pointerstruktur
.Next ist nicht initialisiert und zeigt daher ins Nirvana.
Edit: Und noch etwas. Zwar überprüfst du .Next mit Assigned, jedoch überprüft Assigned auch nur auf <> nil. Nun steht jedoch ein Wert <> nil in .Next und somit gibt Assigned true zurück. Daraus resultiert dann die AV. |
Re: Freigeben einer Pointerstruktur
Hallo,
da es sich in Deinem Fall um eine verkettete Liste handelt, mußt Du am Ende anfangen den Speicher wieder freizugeben. [Edit] Hatte einen Satz nicht gelesen Sorry :oops: [/Edit] |
Re: Freigeben einer Pointerstruktur
Der.Kaktus:
Die Rekursion sorgt dafür, dass es am Ende anfängt ;) und ja ihr habt recht, .next zeigt ins nirvana, 2 semester uni, immer wurde und eingeprügelt "initialisiert eure variablen"....irgendwie vergisst man sowas aber am ehesten ^^ danke! |
Re: Freigeben einer Pointerstruktur
Zitat:
|
Re: Freigeben einer Pointerstruktur
Zitat:
Ich prüfe ob das aktuelle element nicht nil ist, wenn ja, dann ... prüfe ob die unterliste PCommands existiert -> FreeCommand aufrufen ... prüfe ob .Next existiert, wenn ja, erst FreeMakro (Anchor.Next) aufrufen dann erst Aktuelles element freigeben das heißt, die rekursion ist so aufgebaut, das vor dem zerstören des aktuellen elements, erst das nächste zerstört wird, also muss ich nix mit temp elementen speichern oder ähnliches, es ist gewährt das das freigeben hinten anfängt, nicht vorne. MfG |
Re: Freigeben einer Pointerstruktur
Deswegen sprach er ja eine Variante an, welche nicht rekursiv ist.
|
Re: Freigeben einer Pointerstruktur
Versuch es mal so...
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var Anchor : PMakro; begin new (Anchor); Anchor^.TimeStamp := 10; Anchor^.Next := nil; new (Anchor^.Commands); Anchor^.Commands^.KeyInput := True; Anchor^.Commands^.Next := nil; FreeMakro (Anchor); end; |
Re: Freigeben einer Pointerstruktur
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:00 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