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