![]() |
Delphi-Version: 6
Klasse in einer Klasse Destruktor
Wenn ich eine Klasse in einer anderen Klasse instanziere, wird diese Unterklasse zerstört, wenn ich die Oberklasse vernichte, oder muss ich einen extra destruktor für schreiben?
Code:
Bar = class ... Foo = class fBar : Bar; constructor Create; end ... constructor Foo.Create; begin fBar := Bar.create; end; |
AW: Klasse in einer Klasse Destruktor
Hallo,
in diesem Fall musst du das selber machen. Anders wäre es, wenn du einen Owner einführen würdest (wie das bei den Komponentenklassen ist). Das muss du aber erst mal selber programmieren, oder du leitest Deine Basisklasse gleich von TComponent ab. FastMM4 sagt dir schon (Stichwort ReportMemoryLeaksOnShutDown), ob du ein Speicher-Leck hast. |
AW: Klasse in einer Klasse Destruktor
Ok, reicht es wenn ich in der Foo Klasse in dem Destructor dann
fBar.Free; habe? |
AW: Klasse in einer Klasse Destruktor
Ganz genau. Der Destruktor wird auch immer ausgeführt, auch wenn der Konstruktor scheiterte, z.B. eine Exception auftritt.
|
AW: Klasse in einer Klasse Destruktor
Ja, das reicht.
Ich resette/cleare zusätzlich vorher immer noch mögliche Referenzen, Threads, oder Sonstiges, z.B. Events von Aussen, Asynchrone Abfragen oder was Deine Klasse sonst noch Alles anstellt. Damit nicht noch kurz vor oder nach dem .Free irgendwas Gemeines in deinem Objekt weiterlebt. |
AW: Klasse in einer Klasse Destruktor
Zitat:
|
AW: Klasse in einer Klasse Destruktor
Destruktoren sind in Delphi quasi als virtuelle Methode implementiert. Du hättest da auch eigentlich eine Compiler-Warnung bekommen müssen.
Hier einmal als Minimalbeispiel zum Ausprobieren:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TMyObject = class destructor Destroy(); {override;} end; destructor TMyObject.Destroy(); begin inherited; end; var myObject: TObject; begin myObject := TMyObject.Create(); end. |
AW: Klasse in einer Klasse Destruktor
Delphi-Quellcode:
Das würde ich noch ergänzen, damit das Free -> Destroy klar wird.
var
myObject: TObject; begin myObject := TMyObject.Create(); ... myObject.Free; //<=== end. |
AW: Klasse in einer Klasse Destruktor
Hmm..was macht denn das 'inherited' in dem Destruktor? Es wird doch von keienr Klasse geerbt?
|
AW: Klasse in einer Klasse Destruktor
Alle Delphi-Klassen stammen von TObject ab. Das TObject bringt sowohl den Standard-Konstruktor
Delphi-Quellcode:
als auch den Standard-Destruktor
Create()
Delphi-Quellcode:
mit.
Destroy()
Wenn du einen eigenen Destruktor hast, dann solltest du auch wirklich immer ein
Delphi-Quellcode:
drin haben. Ja, wenn man seine Klasse direkt von
inherited
Delphi-Quellcode:
ableitet könnte man es sich sparen. Aber warum nicht? Angenommen deine Klasse
TObject
Delphi-Quellcode:
hat sich ursprünglich nicht von TMyBase abgeleitet, jetzt aber schon. Und du hättest in deinem Destruktor von
TMySpecialization
Delphi-Quellcode:
das
TMySpecialization
Delphi-Quellcode:
nicht drin gehabt. Dann hättest du jetzt ein Speicherleck (oder eventuell schlimmeres) da der Destruktor von
inherited
Delphi-Quellcode:
(und allem darüber) nicht mehr ausgeführt würde.
TMyBase
Delphi-Quellcode:
type
TMyBase = class // man könnte ebenso schreiben "TMyBase = class(TObject)" private var someStuff: TObject; public constructor Create(); destructor Destroy(); override; end; TMySpecialization = class(TMyBase) public constructor Create(); destructor Destroy(); override; end; { TMySpecialization } constructor TMySpecialization.Create(); begin inherited; // sowas von überhaupt nicht überflüssig // (...) end; destructor TMySpecialization.Destroy(); begin // (...) inherited; // sowas von überhaupt nicht überflüssig end; { TMyBase } constructor TMyBase.Create(); begin inherited; // streng genommen überflüssig, aber warum nicht? someStuff := TObject.Create(); end; destructor TMyBase.Destroy(); begin someStuff.Free(); inherited; // GANZ streng genommen überflüssig, aber warum nicht? end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09: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