Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klassen, Instanzen, Zeiger, etc allgemeine Frage (https://www.delphipraxis.net/45783-klassen-instanzen-zeiger-etc-allgemeine-frage.html)

Takeshi 12. Mai 2005 10:17


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:
type
  TNode = class(TObject)
  private
    iValue:integer;
  public
    LNode,RNode:TNode;
  //...
  end;

//----------------------------------------------------

LNode.RNode := TNode.Create(Wert);

//----------------------------------------------------

FreeAndNil(LNode);
LNode.Free;

//----------------------------------------------------

LNode:=LNode.RNode;
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?
Also wäre dankbar wenn mir da jemand Klarheit verschaffen könnte..

Gruß, Christoph

Grendel 12. Mai 2005 10:22

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 ...

Kroko1999 12. Mai 2005 10:28

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;

Takeshi 12. Mai 2005 11:47

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:
LNode:=LNode.RNode;
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.

Nagut, genug soweit, danke schonmal, tut mir leid wenn ich auf irgendetwas jetzt nicht eingegangen sein sollte

Gruß, Christoph

Kroko1999 12. Mai 2005 12:22

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!

sniper_w 12. Mai 2005 12:26

Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage
 
Delphi-Quellcode:
constructor TNode.Create;
begin
  inherited;
  FLNode := TNode.Create;
  FRNode := TNode.Create;
end;
Ich bezweifle dass das jemals zu Ende gehen wird-> unendliche Schleife. Es schluckt speicher bis es nicht mehr geht. :gruebel:

EDIT
Und zwar wird FRNode nie einen Platz im RAM finden...

Kroko1999 12. Mai 2005 12:30

Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage
 
AUWEIA, dass habe ich übersehen! :shock:

Takeshi 12. Mai 2005 12:47

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 11:12 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