Einzelnen Beitrag anzeigen

swestner

Registriert seit: 31. Aug 2012
Ort: Hallstadt
74 Beiträge
 
Delphi 10.4 Sydney
 
#1

Interfaces in lokalen Variablen und deren Freigabe

  Alt 24. Aug 2021, 00:51
Delphi-Version: 10.4 Sydney
Hallo,

ich habe folgenden Code:
Code:
procedure TfrmEditBasic.actAddDatapointsExecute(Sender: TObject);
var
  g:IMyInterfacedObject;
  a: TMyObject;
  b: TMyObject1;
begin
  a:=TMyObject.Create;
  b:=TMyObject1.Create;
  g:=TMyInterfacedObject.Create(a, b); // liefert ein TMyInterfacedObject zurück
  // ...
end;
TMyInterfacedObject fügt die beiden im Konstruktur übergebenen Objekte in eine Liste ein und wenn dann am Ende der Methode das g von Delphi zerstört wird dann zerstört das TMyInterfacedObject automatisch auch die Objekte a und b und ich spare mir das Free am Ende.

Mit FastMM4 erhalte ich beim End eine Schutzverletzung. a oder b werden doppelt freigegeben.

Wenn ich vor dem End ein g:=Nil mache, dann ist die Schutzverletzung weg.

Alternativ habe ich meinen Code wie folgt umgebaut und die lokale Variable weggelassen und dann erhalte ich auch keine Schutzverletzung:

Code:
procedure TfrmEditBasic.actAddDatapointsExecute(Sender: TObject);
var
  a: TMyObject;
  b: TMyObject1;
begin
  a:=TMyObject.Create;
  b:=TMyObject1.Create;
  CreateInterfacedObject(a,b);
  //...
end;
wobei CreateInterfacdObject wie folgt aussieht:
Code:
function CreateInterfacdObject (var v0, v1): IMyInterfacedObject;
begin
  exit(TMyInterfacedObject.Create(v0,v1));
end;
Ich verstehe das gerade absolut nicht. Warum funktioniert der ursprüngliche Code nicht oder nur, wenn ich g auf NIL setze? Und warum funktioniert es wenn ich keine lokale Variable verwende?

Grüße

Stefan
Stefan Westner
  Mit Zitat antworten Zitat