Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#29

AW: MemoryLeak bei TList<IMyInterface>

  Alt 26. Feb 2015, 19:36
Es kann sein, daß der Compiler die Variable tmpBumsList direkt als Result für GetNewGuidList verwendet.
Nein, das ist bestimmt so.

Gemanagete Typen als Result werden in einen Var-Parameter umgewandelt.
Aus function GetNewGuidList: IGuidList; macht der Compiler ein procedure GetNewGuidList(var Result: IGuidList); .

Da das Feld nicht direkt übergeben werden kann (bzw. er zu doof dafür ist), wird automatisch eine temporäre Variable generiert.

Der Code des Compilers sieht also so aus
Delphi-Quellcode:
constructor TDings.Create;
var
  tmpBumsList: IGuidList;
  {$REGION 'AUTOGENERATED'}
  AutogeneratedVariable1: IGuidList;
  {$ENDREGION}
begin
  {$REGION 'BEGIN'}
  tmpBumsList := nil;
  AutogeneratedVariable1 := nil;
  try
  {$ENDREGION}

  inherited Create;

  TFactory.GetNewGuidList(tmpBumsList);
  // tmpBumsList.RefCount = 1

  TFactory.GetNewGuidList(AutogeneratedVariable1);
  Self.fBumsList := AutogeneratedVariable1;
  // fBumsList.RefCount = 2

  {$REGION 'END'}
  finally
    tmpBumsList := nil;
    AutogeneratedVariable1 := nil;
  end;
  {$ENDREGION}
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (26. Feb 2015 um 19:40 Uhr)
  Mit Zitat antworten Zitat