![]() |
Klassen, Instanzen, Zeiger, etc allgemeine Frage
Hallo
Ich habe mal so eine allgemeine Frage zu Klasseninstanzen. Am besten mal das Beispiel bei dem mir diese Frage kam
Delphi-Quellcode:
Ist mehr oder weniger nur pseudo Code, soll so nichts können. Aber ich frage mich wie ich mit den erzeugten Instanzen am besten umgehe, bzw was die aufgeführten Anweisungen genau bewirken. Insbesondere bei "LNode:=LNode.RNode;" was geschieht hierbei denn mit dem Objekt welches ich ursprünglich in LNode erstellt habe? Ist doch auch irgendwie noch da oder?
type
TNode = class(TObject) private iValue:integer; public LNode,RNode:TNode; //... end; //---------------------------------------------------- LNode.RNode := TNode.Create(Wert); //---------------------------------------------------- FreeAndNil(LNode); LNode.Free; //---------------------------------------------------- LNode:=LNode.RNode; Also wäre dankbar wenn mir da jemand Klarheit verschaffen könnte.. Gruß, Christoph |
Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage
In deinem Fall hast Du ein Speicherleck produziert, da RNode niemals freigegeben wird.
Du könntest RNode im Destructor von LNode freigeben. Außerdem würde "LNode:=LNode.RNode;" eine Zugriffsverletzung werfen, da LNode an dieser Stelle breits nil ist. Das "LNode.Free;" nach dem "FreeAndNil(LNode);" ist überflüssig, da FreeAndNil ja breits Free aufruft. Bis neulich ... |
Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage
Ich würde es so machen:
Delphi-Quellcode:
type
TNode = class(TObject) constructor Create; destructur Destroy; override; private iValue:integer; FRNode, FLNode: TNode; procedure SetLNode (const Value: TNode); procedure SetRNode (const Value: TNode); public LNode: TNode read FLNode write SetLNode; RNode: TNode read FRNode write SetRNode; end; constructor TNode.Create; begin inherited; FLNode := TNode.Create; FRNode := TNode.Create; end; destructor TNode.Destroy; begin FLNode.Free; FRNode.Free; inherited; end; procedure TNode.SetLNode (const Value: TNode); begin // nur die benötigten Eigenschaften übernehmen //z.Bsp. FLNode.iValue := Value.iValue; end; procedure TNode.SetRNode (const Value: TNode); begin //etc. end; |
Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage
@Grendel waren nur ne Reihe beispielhafter Operationen die nicht in dieser Reihenfolge ausgeführt werden sollten sry
@Kroko1999 hmm ist im Grunde natürlich ganz hübsch die gleich mit zu erstellen. Ich gehe aber mal zurück aufs eigentliche Beispiel. Also man erkennt ja hier dass ich an einer Baumstruktur arbeite. Es tritt nun der Fall ein, dass von einem Knoten, der selbst entfernt werden soll an seine Stelle sein ihm rechts untergeordneter Knoten tritt. also daher:
Delphi-Quellcode:
Also an sich funktioniert mein Programm ja auch bereits, ist nur zu komplex es hier ganz zu posten. Ich mache mir eben nur Gedanken darüber was im Speicher mit dem LNode passiert der eigentlich entfernt werden sollte, dem ja jetzt nur ein anderer Knoten zugewiesen wird. Der alte LNode existiert ja wahrscheinlich trotzdem noch irgendwo. Aber Destroy geht ja auch nicht so einfach, weil ich ja den daran hängenden Zweig noch erhalten möchte.
LNode:=LNode.RNode;
Nagut, genug soweit, danke schonmal, tut mir leid wenn ich auf irgendetwas jetzt nicht eingegangen sein sollte Gruß, Christoph |
Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage
Wenn dies ein Baum wird, dann würde ich noch FParent dazu nehmen und beim löschen die Nachfahren einfach selbst in Parent übertragen und dann den Knoten freigeben!
|
Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage
Delphi-Quellcode:
Ich bezweifle dass das jemals zu Ende gehen wird-> unendliche Schleife. Es schluckt speicher bis es nicht mehr geht. :gruebel:
constructor TNode.Create;
begin inherited; FLNode := TNode.Create; FRNode := TNode.Create; end; EDIT Und zwar wird FRNode nie einen Platz im RAM finden... |
Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage
AUWEIA, dass habe ich übersehen! :shock:
|
Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage
hmm ein Parent ist eigentlich nicht erwünscht, da es bisher auch ohne ging.
Außerdem gibt es auch noch andere Fälle, es wird nicht grundsätzlich der Nachfahre in seinen Parent geschoben |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 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