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
Seite 1 von 2  1 2      
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
Online

Registriert seit: 6. Mär 2013
6.110 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
Rollo62

Registriert seit: 15. Mär 2007
3.901 Beiträge
 
Delphi 12 Athens
 
#5

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
kagi3624

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

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
Online

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

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
Rollo62

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

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 08:51
Delphi-Quellcode:
var
   myObject: TObject;
begin
   myObject := TMyObject.Create();
   ...
   myObject.Free; //<===
end.
Das würde ich noch ergänzen, damit das Free -> Destroy klar wird.
  Mit Zitat antworten Zitat
kagi3624

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

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 09:02
Hmm..was macht denn das 'inherited' in dem Destruktor? Es wird doch von keienr Klasse geerbt?
  Mit Zitat antworten Zitat
Der schöne Günther
Online

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

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 09:13
Alle Delphi-Klassen stammen von TObject ab. Das TObject bringt sowohl den Standard-Konstruktor Create() als auch den Standard-Destruktor Destroy() mit.

Wenn du einen eigenen Destruktor hast, dann solltest du auch wirklich immer ein inherited drin haben. Ja, wenn man seine Klasse direkt von TObject ableitet könnte man es sich sparen. Aber warum nicht? Angenommen deine Klasse TMySpecialization hat sich ursprünglich nicht von TMyBase abgeleitet, jetzt aber schon. Und du hättest in deinem Destruktor von TMySpecialization das inherited nicht drin gehabt. Dann hättest du jetzt ein Speicherleck (oder eventuell schlimmeres) da der Destruktor von TMyBase (und allem darüber) nicht mehr ausgeführt würde.

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;

Geändert von Der schöne Günther ( 7. Mai 2020 um 09:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:51 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