Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Destructor in TClass (https://www.delphipraxis.net/16444-destructor-tclass.html)

Jelly 17. Feb 2004 09:43


Destructor in TClass
 
Hallo,

habe ein kleines Verständisproblem zu meinem Destructor in einer aus TObject abgeleiteten Klasse... hier mal bischen Quelltext:

Delphi-Quellcode:
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;
Jetz wird aber, wenn ich über log.free versuche die Klasse wieder frei zu geben, mein Destructor nicht aufgerufen... Wie kann das sein.

Im übrigen versteh ich auch nicht so recht, was überhaupt in TObject passiert... folgende Zeile sind da implementiert:
Delphi-Quellcode:
destructor TObject.Destroy;
begin
end;

procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
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.

Vielen Dank schon mal für bisch *LichtinTunnelbringen*

Gruß,
Tom

Jelly 17. Feb 2004 10:00

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

teebee 17. Feb 2004 10:14

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:
Instanz := TInstanzklasse.Create;
aufruft.)
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

Jelly 17. Feb 2004 10:25

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

teebee 17. Feb 2004 10:27

Re: Destructor in TClass
 
Das macht der Compiler implizit mit FreeInstance selbst, ohne, dass Du was davon siehst.

Gruß, teebee

Tyrael Y. 17. Feb 2004 10:39

Re: Destructor in TClass
 
Delphi-Quellcode:
destructor TLogFile.Destroy ;
begin
  try
    showmessage ('Destroy Log') ;
    closefile (LF) ;
  except
  end ;
  inherited;
end;
so wäre dein code richtig

Jelly 17. Feb 2004 10:54

Re: Destructor in TClass
 
Zitat:

Zitat von teebee
Das macht der Compiler implizit mit FreeInstance selbst, ohne, dass Du was davon siehst.

Ja dann kann ich das ja nirgends finden :lol:
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