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

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.199 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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
Online

Registriert seit: 15. Mär 2007
4.170 Beiträge
 
Delphi 12 Athens
 
#3

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
 
#4

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

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

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
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.658 Beiträge
 
Delphi 12 Athens
 
#6

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 09:59
Moooment: versuch einmal, eine Variable vom Typ TMyBase zu deklarieren und ihr eine Instanz von TMySpecialization zuzuweisen. Was geschieht dann mit dem Konstruktor von TMySpecialization (Haltepunkt)?
Delphi-Quellcode:
procedure WhatKnowThenI;
var
  SomeInstance: TMyBase;
begin
  SomeInstance := TMySpecialization.Create;
  SomeInstance.Free;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.355 Beiträge
 
Delphi 12 Athens
 
#7

AW: Klasse in einer Klasse Destruktor

  Alt 7. Mai 2020, 11:13
Zitat:
Delphi-Quellcode:
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;
Überflüssig ist da garnichts.

Wenn du jetzt mit absoluter Sicherheit sagen kannst, dass jetzt und auch in zukunft in den Methoden des Vorfahren niemals Code sein wird, dann ist es "unnötig".
Wenn nicht, dann sollte man es besser immer einfügen.

Wenn es "gerade jetzt" nicht benötigt wird, weil es keine gleichnamige Methode im Vorfahren gibt, dann lässt der Compiler das inherited im Kompilat weg.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.002 Beiträge
 
#8

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
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 16:41 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