Einzelnen Beitrag anzeigen

Elrond

Registriert seit: 29. Sep 2014
71 Beiträge
 
#1

Unstimmigkeit bei Referenzzählung von Interfaces?

  Alt 14. Mär 2018, 14:08
Delphi-Version: 10 Berlin
Es sieht so aus als würde Delphi eine Referenz doppelt zählen wenn die Zielvariable global ist.
Vermutlich lässt es sich mit den folgenden Beispiel besser beschreiben:

Code:
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  Unit1 in 'Unit1.pas';

var
  IntfA: InterfaceA;
  TempA : Temp;

begin
  try
  TempA := Temp.Create;
  TempA.LocalTest;
    IntfA := TempA.GetInterfaceA; //_AddRef wird einmal für das Result von GetInterfaceA aufgerufen und einmal für die Zuweisung zu IntfA
    IntfA := nil; //_Release wird erwartungsgemäß aufgerufen, aber erst beim beenden wird ein weiteres mal _Release aufgerufen, wer hält also die zweite Referenz? 
    Writeln('?');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.
Code:
unit Unit1;

interface

type

  InterfaceA = interface(IInterface)
    ['{A1229A9D-E207-4CBD-9432-FEFD9D3C1684}']
    function Add(sum1, sum2: Integer): Integer;

  end;

  ImplA = class(TInterfacedObject, InterfaceA)
  public
    function Add(sum1, sum2: Integer): Integer;

  end;

  Temp = class
  public
    function GetInterfaceA: InterfaceA;
    procedure LocalTest;
  end;

implementation

{ Temp }

function Temp.GetInterfaceA: InterfaceA;
begin
  Result := ImplA.Create;
end;

procedure Temp.LocalTest;
var
  IntfA: InterfaceA;
begin
  IntfA := Self.GetInterfaceA; //_AddRef wird hier jedoch nur ein einziges mal aufgerufen, woher kommt der Unterschied? 
  IntfA := nil;  //_Release wird erwartungsgemäß aufgerufen
end;

{ ImplA }

function ImplA.Add(sum1, sum2: Integer): Integer;
begin
  Result := 42;
end;

end.
  Mit Zitat antworten Zitat