Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Mischen von Interface- und Klassenreferenzen

  Alt 20. Mär 2018, 14:57
In diesem speziellen Fall sollte es keine Probleme verursachen.

Gefährlich ist aber z.B. sowas:
Delphi-Quellcode:
procedure DoSomethingWithFoo(Foo: IFoo);
begin
end;

function CreateFoo: IFoo;
var
  TmpFoo: TFoo;
begin
  TmpFoo := TmpFoo.Create();
  TempFoo.X := 1;

  DoSomethingWithFoo(TmpFoo);

  Result := TmpFoo;
end;
In dem Fall würde es crashen, weil intern grob folgendes passiert:
Delphi-Quellcode:
procedure DoSomethingWithFoo(Foo: IFoo);
begin
end;

function CreateFoo: IFoo;
var
  TmpFoo: TFoo;
  TmpInterface: IFoo;
begin
  TmpFoo := TmpFoo.Create(); // RefCount = 0
  TempFoo.X := 1;

  TmpInterface := TmpFoo; // inc(RefCount) (= 1)
  DoSomethingWithFoo(TmpInterface);
  TmpInterface := nil; // dec(RefCount) (= 0) -> TmpFoo.Free;
  
  Result := TmpFoo; // inc(RefCount)... crash, weil Objekt schon freigegeben ist
end;
Es muss natürlich nicht genau an der Stelle crashen, sondern kann auch irgendwann später crashen.
  Mit Zitat antworten Zitat