Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#8

AW: Supports ohne out Parameter

  Alt 10. Okt 2012, 12:36
Danke für die Antworten, das mit Referenzzählung hätte mir auffallen müssen, aber
was ist mit dem zweiten Teil der Frage?
Wie und warum genau verändert Supports() die Instanz so das bei dem Aufruf von
Supports(a, ISecond) als Rückgabe Wert false rauskommt?
Offensichtlich war meine Erklärung nicht verständlich genug: Es ist nicht das QueryInterface was die Referenzzählung auslöst, sondern die Implementierung des Supports ohne out-Parameter:

Delphi-Quellcode:
function Supports(const Instance: IInterface; const IID: TGUID): Boolean;
var
  Temp: IInterface;
begin
  Result := Supports(Instance, IID, Temp);
end;
Nach dem a := TFirstSecond.Create ist der Referenzzähler von a = 0. Beim ersten Aufruf von Supports wird in der Support-Funktion für Temp ein implizites AddRef und Release ausgelöst, da beim Verlassen der Funktion alle lokalen Interface-Variablen auf nil gesetzt werden. Beim Release springt der Referenzzähler wieder auf 0 und die Instanz wird freigegeben. Danach verweist a nicht mehr auf eine gültige Instanz und es geschehen nicht vorhersagbare Dinge.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat