Die Kette der Destruktoren muss abgearbeitet werden; sie darf nicht unterbrochen werden. Falls doch, droht ein Resourcen-/Speicherleck.
Doch, ist es ... wenn ich den Constructor ebenfalls übergangen hab und/oder für die Freigaben selbst gesorgt hab.
Nein, ein Destruktor einer Klasse hat eine ganz bestimmte
Verantwortung:
1.) er muss die lokalen belegten Resourcen seiner Klasse freigeben!
2.) er muss die Resourcen freigeben, die seiner Klasse überantwortet wurden
Zum Beispiel übernimmt die Klasse TComponent die Verantwortung dafür, dass alle Objekte im Components[]-Array im Destruktor entsorgt werden.
3.) er muss seiner Vaterklasse die Möglichkeit geben sich selbst aufzuräumen in dem er
inherited
aufruft.
Was im Destruktor der Vaterklasse passiert und ob dessen Konstruktor aufgerufen wurde oder nicht hat nicht zu interessieren.
Der Sourcecode der Vaterklasse muss als Blackbox betrachtet werden;
es muss völlig egal sein was in der Vaterklasse an Resourcen belegt wurde oder nicht.
Wichtig ist allein nur der Vaterklasse über den Aufruf von inherited die Chance zu geben, alle belegten Resourcen zu entsorgen.
4.) er muss so programmiert sein, dass selbst wenn ein Objekt nur teilweise initialisiert wurde (z.B.
Exception im Konstructor) er gefahrlos die bislang belegten Resourcen freigibt.
Das sind die Regeln; das ist der (ungeschriebene) Vertrag der bei Ableitung einer Klasse geschlossen wurde.