Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Free gibt die Klasse nicht frei (https://www.delphipraxis.net/86923-free-gibt-die-klasse-nicht-frei.html)

Bigeddie 21. Feb 2007 08:41


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

Muetze1 21. Feb 2007 08:44

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.

Bigeddie 21. Feb 2007 09:06

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

Christian Seehase 21. Feb 2007 09:14

Re: Free gibt die Klasse nicht frei
 
Moin Ernst,

Zitat:

Zitat von Bigeddie
FreeAndNil zeigt mir aber bei d6 mein Objekt nicht in der Programmierhilfe an.

das ist auch keine Methode, sondern eine Funktion. Gib mal FreeAndNil in der Hilfe ein, oder schreib' es in die IDE und drücke F1.

Konse 21. Feb 2007 10:00

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

TBx 21. Feb 2007 10:07

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

Konse 21. Feb 2007 10:38

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

IngoD7 21. Feb 2007 10:45

Re: Free gibt die Klasse nicht frei
 
Zitat:

Zitat von Konse
Bei Abstrakten klassen, die auch datencontainer enthalten können, setzt du dort deinen Destruktor virtuell??
[...]
ich überschreibe da den destruktor von Tobject mit override
-> mein nachfahre hat sich darum zu kümmern im destructor inherited aufzurufen.

Das gilt doch für alle Nachfahren, also für TMyAbstrClass und für TMyNachfahre.
Übrigens: Ein Destructor mit override ist selbst auch wieder virtuell.

Zitat:

Zitat von Konse
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.

Nein, wenn MyInstanz von TMyNachfahre (MyInstanz:=TMyNachfahre.Create) ist, dann ruft ein MyInstanz.Free den Destructor von TMyNachfahre auf.

Konse 21. Feb 2007 11:03

Re: Free gibt die Klasse nicht frei
 
Zitat:

Übrigens: Ein Destructor mit ovveride ist selbst auch wieder virtuell.
das war wohl das schlüsselwort. Danke für deine Korrektur.
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