Ich gebe hier mal ein paar
goldene Regeln vor.
An die Skeptiker hier: Ihr müsst das einfach als gegeben annehmen. Es wurde von Borland so designt.
Ich kann nur empfehlen, diese Regeln immer zu beachten. Ausdrucken, lesen und an den Monitor kleben...
1.) es gibt nur
EINEN Destruktor! (Es kann nur einen geben)
Grund: ein Objekt kann auch ohne dass der Programmierer explizit der Destruktor aufgerufen hat, sterben.
Man denke hier nur an die Referenzzählung über
COM Interfaces.
2.) der Destruktor
muss immer
Destroy heisen !
Pro Klasse darf man einen Destruktor namens Destroy deklarieren
3.) dagegen kann es beliebig viele Konstruktoren geben
4.) dieser eine Destruktor ist von Hause aus
virtuell (und das hat seine Gründe und Vorteile, wie oben schon vor Einigen erklärt wurde)
Zusammen mit 1) bedeutet das, dass man keine neue Arten von Destruktoren einführen kann
5.) Innerhalb des Destruktors muss man grundsätzlich immer
inherited als
letzte Anweisung aufrufen.
Delphi-Quellcode:
destructor TMeinObjekt.destroy;
begin
FInneresObj.Free;
inherited; // <= wer das vergisst, den holt der Speicherfresser !!!
end;
Jede Klasse räumt seine selbst belegten Resourcen ab und muss dann den Destruktor der ererbten Klasse aufrufen. TObject.Destroy gibt dann der Speicher für das Objekt frei.
6.) Destroy wird grundsätzlich niemals direkt aufgerufen; es muss
Free benutzt werden
Delphi-Quellcode:
FMeinObjekt.Destroy; // <= so ist der Ärger vorprogrammiert (FMeinObjekt könnte nil sein) !!
FMeinObjekt.Free; // das ist ok
FreeAndNil(FMeinObjekt); // auch erlaubt aber mehr Overhead
// möglich (aber ziemlich blöd, da es ja Free gibt) wäre auch
if Assigned(FMeinObjekt) then FMeinObjekt.Destroy;
7.) der Destruktor muss mit
Override deklariert werden; alles andere wäre falsch (dies erklärt sich aus 1.) und 4.))
Delphi-Quellcode:
TMeinObjekt = class(TPersistent)
public
destructor Destroy;override;
end;