![]() |
Free gibt die Klasse nicht frei
Hallo Leute,
habe eine Klasse (abgeleitet von TComponent). Nun folgendes Problem. Ein Objekt dieser Klasse wird zu einer bestimmten Zeit in der Unit erzeugt und soll zu einer bestimmten Zeit auch wieder freigegeben werden. Nach dem Aufruf der Methode free sollte die Variable vom Typ Klasse eigentlich NIL sein ist sie aber nicht. Wo liegt hier das Problem? Grüße Ernst Jürgen |
Re: Free gibt die Klasse nicht frei
... daran, dass Free den Destructor aufruft und das Objekt freigibt, aber sich nicht darum kümmert die Variable irgendwie zu verändern. Warum auch. Du kannst doch mit 'zig Variablen auf ein und dieselbe Instanz zeigen - soll er dir alle auf einmal auf Nil setzen? Dazu müsste er alle Variablen kennen die auf das Objekt zeigen - und das tut er nicht. Er kennt nicht mal eine Variable.
Abhilfe schafft es hier, die Variable nach dem Free selbst auf Nil zu setzen oder die Procedure FreeAndNil() zu verwenden, die einen Free Aufruf und das Nil setzen vereint in einer Prozedur. |
Re: Free gibt die Klasse nicht frei
FreeAndNil zeigt mir aber bei d6 mein Objekt nicht in der Programmierhilfe an.
Kann es dadurch nicht zu speicherlöchern kommen? Außerdem dachte ich, beim Aufruf Objekt.free würde die Variable automatisch auf NIL gesetzt. Ich versuchs jedenfalls mal aus und melde mich dann nochmal Danke und Grüße Ernst Jürgen |
Re: Free gibt die Klasse nicht frei
Moin Ernst,
Zitat:
|
Re: Free gibt die Klasse nicht frei
Hoi Ernst,
meines wissens musst du die Free Methode dann auch in deiner Klasse deklarieren. Ansonsten wird bei dem Benutzen von DeineKlasse.Free oder FreeAndNil(deineKlasse), der destruktor vom Vorfahren aufgerufen. Im Destruktor kannst du dann Vorkehrungen treffen das element auf nil zu setzen. Falls ich da falsch liege berichtigt mich ! Man lernt ja gerne dazu ^^ Gruß Konse |
Re: Free gibt die Klasse nicht frei
@Konse: Ja, da muß ich dich berichtigen.
Destructoren sind normalerweise - eben damit da Free in Nachfahren greift - virtuell deklariert. Daher überschreibt man einen Destructor auch in der Regel mit der Direktive override. Hat man sich daran gehalten, muß das Free nicht erneut definiet werden. Gruß Thomas |
Re: Free gibt die Klasse nicht frei
@onlineKater: Ich gebe dir diesbezüglich recht "Wenn" der Destruktor des Vorfahrens virtuell deklariert worden ist.
Bei Abstrakten klassen, die auch datencontainer enthalten können, setzt du dort deinen Destruktor virtuell?? "wenn ja, wäre ein beispiel nicht schlecht, wie du dir deine resourcen freest" ich überschreibe da den destruktor von Tobject mit override -> mein nachfahre hat sich darum zu kümmern im destructor inherited aufzurufen. wenn jedoch die free methode von TObject (superclass) aufgerufen wird, so wird maximal nur die abstrakte klasse freigegeben wenn man die free methode nicht im nachfahren nochmals redeklariert. Tobj -> TMyAbstrClass -> TMyNachfahre Beste Grüße, Mario |
Re: Free gibt die Klasse nicht frei
Zitat:
Übrigens: Ein Destructor mit override ist selbst auch wieder virtuell. Zitat:
|
Re: Free gibt die Klasse nicht frei
Zitat:
Du hast recht. Gruß, Mario |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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