AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Klasse in einer Klasse Destruktor

Ein Thema von kagi3624 · begonnen am 7. Mai 2020 · letzter Beitrag vom 7. Mai 2020
Antwort Antwort
kagi3624

Registriert seit: 3. Feb 2020
138 Beiträge
 
Delphi 6 Enterprise
 
#1

Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 07:50
Delphi-Version: 6
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;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 07:58
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.
Heiko
  Mit Zitat antworten Zitat
kagi3624

Registriert seit: 3. Feb 2020
138 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 08:08
Ok, reicht es wenn ich in der Foo Klasse in dem Destructor dann

fBar.Free; habe?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.114 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 08:26
Ganz genau. Der Destruktor wird auch immer ausgeführt, auch wenn der Konstruktor scheiterte, z.B. eine Exception auftritt.
  Mit Zitat antworten Zitat
kagi3624

Registriert seit: 3. Feb 2020
138 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 08:34
Ganz genau. Der Destruktor wird auch immer ausgeführt, auch wenn der Konstruktor scheiterte, z.B. eine Exception auftritt.
Ich habe aber gerade gesehen, dass mein destructor nicht (explicit) ? aufgerufen wird, wenn ich nur Foo.Free; habe. Erst wenn ich ein override; hinter dem Destructor habe, wird dieser mit Free aufgerufen.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.114 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 08:44
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.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
933 Beiträge
 
#7

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 13:38
Ganz genau. Der Destruktor wird auch immer ausgeführt, auch wenn der Konstruktor scheiterte, z.B. eine Exception auftritt.
Ich habe aber gerade gesehen, dass mein destructor nicht (explicit) ? aufgerufen wird, wenn ich nur Foo.Free; habe. Erst wenn ich ein override; hinter dem Destructor habe, wird dieser mit Free aufgerufen.
Ich mach das immer so, dass ich bereits beim erstellen der Destructor-Methode mit dem Code-Insight arbeite. Einfach zwischen TFoo=class und end; STRG+Leertaste, Exec eingeben, dann steht das schon Execute, und mit Enter bestätigen. Code-Insight erstellt die Destuctor-Methode gleich korrekt und legt auch den Public-Abschnitt gleich mit an, wenn nötig.
Spart Zeit und man kann das unscheinbare override nicht vergessen (passierte mir früher regelmäßig).

Übrigens: mit Shift+CTRL+C wird werden auch die Methoden gleich im Implementation-Abschnitt erstellt.

Leider klappt das mit dem Constructor nicht ganz so komfortabel.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder ( 7. Mai 2020 um 13:41 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.932 Beiträge
 
Delphi 12 Athens
 
#8

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 08:31
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz