![]() |
Destructor in TClass
Hallo,
habe ein kleines Verständisproblem zu meinem Destructor in einer aus TObject abgeleiteten Klasse... hier mal bischen Quelltext:
Delphi-Quellcode:
Jetz wird aber, wenn ich über log.free versuche die Klasse wieder frei zu geben, mein Destructor nicht aufgerufen... Wie kann das sein.
type
TLogFile = class private FLogname : string ; FZeitstempel : boolean ; LF : textfile ; public constructor Create (Logfilename : string ; const MitZeitstempel : boolean = false) ; destructor destroy ; override ; end ; var log : TLogFile ; implementation uses dialogs, sysutils ; { TLogFile } constructor TLogFile.Create (Logfilename : string ; const MitZeitstempel : boolean = false) ; begin { ... der klappt, deshalb ausgeklammert } end; destructor TLogFile.Destroy ; begin try try showmessage ('Destroy Log') ; closefile (LF) ; except end ; finally inherited Destroy ; end ; end; Im übrigen versteh ich auch nicht so recht, was überhaupt in TObject passiert... folgende Zeile sind da implementiert:
Delphi-Quellcode:
Also wenn mich da nicht alles täuscht, wird durch den Aufruf log.free mein neuer Destructor Destroy aufgerufen. Mit dem Aufruf inherited Destroy wird dann der aus TObject noch ausgeführt, WO NICHTS DRIN STEHT... Mich würd mal interessieren, wo denn jetzt überhaupt der Speicher freigegeben wird... TObject ist doch die Basisklasse, oder irre ich mich da.
destructor TObject.Destroy;
begin end; procedure TObject.Free; begin if Self <> nil then Destroy; end; Vielen Dank schon mal für bisch *LichtinTunnelbringen* Gruß, Tom |
Re: Destructor in TClass
Ok... mein erstes Problem hat sich geklärt. Es lag nicht an der Klassenimplementierung, sondern weil ich aus Versehen 2. mal log:=TLogFile.Create('datei.log');
aufgerufen hab... Daher der Trouble im Destructor beim Aufruf von log.free ; 2. Frage beschäftigt mich aber immer noch, da nirgendswo der Speicher wirklich freigegeben wird... Irgendwo muss das doch in TOBject stehen? Gruß, Tom |
Re: Destructor in TClass
Der Speicher für die Instanz wird nicht innerhalb des Codes in Create/Destroy erzeugt bzw. freigegeben, sondern unsichtbar vom Compiler über implizite Aufrufe von NewInstance/FreeInstance. (Das hängt noch von einem zweiten unsichtbaren Parameter ab (zusätzlich zu Self), ein Boolean, der vom Compiler auf True gesetzt wird, wenn man z.B.
Delphi-Quellcode:
aufruft.)
Instanz := TInstanzklasse.Create;
Rufst Du Create mit einem bestehenden Objekt oder inherited auf, ist dieser Parameter auf False gesetzt, und Create verhält sich wie eine normale Methode, es wird keine neue Instanz erzeugt. Gruß, teebee |
Re: Destructor in TClass
Ja, aber irgendwo in einer .pas Datei muss doch der Code stehen, der jetzt den OS sagt, daß er den Speicher wieder freigeben soll? Ich blick da nicht so recht durch.
Tom |
Re: Destructor in TClass
Das macht der Compiler implizit mit FreeInstance selbst, ohne, dass Du was davon siehst.
Gruß, teebee |
Re: Destructor in TClass
Delphi-Quellcode:
so wäre dein code richtig
destructor TLogFile.Destroy ;
begin try showmessage ('Destroy Log') ; closefile (LF) ; except end ; inherited; end; |
Re: Destructor in TClass
Zitat:
vielen Dank für klare Ausage. Gruß, Tom |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:31 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