Einzelnen Beitrag anzeigen

Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#27

AW: Delphi Kurzreferenz

  Alt 6. Jan 2011, 16:50
Allgemein:
Es muss eig. nicht immer inherited aufgerufen werden. Bei Konstruktoren schon gar nicht und bei Destruktoren kann man es weg lassen, wenn man von TObject ableitet
Wenn man im Konstruktor das inherited nicht aufruft, dann wird keiner der ererbten Konstruktoren aufgerufen.
Das kann zu Zugriffsfehlern führen, wenn dadurch z.B. in der Basisklasse eingebettete Objekte nicht angelegt werden.
Beim Destruktor kann ein fehlendes inherited zu Speicherlecks und Resourcenverlust führen.
Man ist nur dann auf der sicheren Seite wenn man grundsätzlich immer inherited verwendet.
Der Name der Basisklasse ist ja ganz leicht von TObject auf eine andere Klasse geändert;
wenn man im Konstruktor oder Destruktor schlampig war können leicht (sehr heimtückische) Probleme auftreten.

Auch dass inherited als letzte Anweisung im Destruktor stehen muss finde ich so nicht richtig. In den meisten Fällen wir dies wohl stimmen, aber es gibt auch Szenarien, wo es so nicht geht.
Nach dem Aufruf von inherited ist das Objekt freigegeben, jeder Zugriff auf ein Feld des Objekt ist also ein Zugriff auf ungültigen Speicher.
Oftmals bleibt der Zugriff auf den freigegebenen Speicher folgenlos, aber man hat eine tickende Zeitbombe im Sourcecode!
Delphi-Quellcode:
destructor TKlasseXY.Destroy; // Beispiel für potentiell gefährlichen Code
begin
  inherited;
  // Ab diesem Zeitpunkt ist "FHandle" ungültiger Speicher
  CloseHandle(FHandle); // dieser Aufruf kann zu einer Zugriffsverletzung führen
end;
Also ich kenne kein Szenario in dem es nötig wäre nach den Aufruf von inherited noch etwas anderes zu tun.
  Mit Zitat antworten Zitat