AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Klassen, Instanzen, Zeiger, etc allgemeine Frage
Thema durchsuchen
Ansicht
Themen-Optionen

Klassen, Instanzen, Zeiger, etc allgemeine Frage

Ein Thema von Takeshi · begonnen am 12. Mai 2005 · letzter Beitrag vom 12. Mai 2005
Antwort Antwort
Takeshi

Registriert seit: 17. Aug 2003
Ort: Mülheim Ruhr
26 Beiträge
 
#1

Klassen, Instanzen, Zeiger, etc allgemeine Frage

  Alt 12. Mai 2005, 11:17
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
Christoph Friedrich
  Mit Zitat antworten Zitat
Grendel
(Gast)

n/a Beiträge
 
#2

Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage

  Alt 12. Mai 2005, 11:22
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage

  Alt 12. Mai 2005, 11:28
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;
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
Takeshi

Registriert seit: 17. Aug 2003
Ort: Mülheim Ruhr
26 Beiträge
 
#4

Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage

  Alt 12. Mai 2005, 12:47
@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:
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
Christoph Friedrich
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage

  Alt 12. Mai 2005, 13:22
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!
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage

  Alt 12. Mai 2005, 13:26
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.

EDIT
Und zwar wird FRNode nie einen Platz im RAM finden...
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage

  Alt 12. Mai 2005, 13:30
AUWEIA, dass habe ich übersehen!
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
Takeshi

Registriert seit: 17. Aug 2003
Ort: Mülheim Ruhr
26 Beiträge
 
#8

Re: Klassen, Instanzen, Zeiger, etc allgemeine Frage

  Alt 12. Mai 2005, 13:47
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
Christoph Friedrich
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:57 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