Um so viele Informationen wie möglich gehalten, hier ist ein sehr einfaches Beispiel dafür, was ich tueProblem mit Freigabe Objekten Interfaced wenn sie in einem Array
type
IMyInterface = interface
[THE_GUID_HERE]
// some methods
end;
TMyInterfaceArray = Array of IMyInterface;
TMyInterfacedObject = class(TInterfacedObject, IMyInterface)
// implementation of the Interface etc. here
end;
TContainingObject = class
private
FIObjectArray: TMyInterfaceArray;
public
constructor Create;
destructor Destroy; override;
procedure NewInstanceOfInterfacedObject;
end;
implementation
constructor TContainingObject.Create;
begin
inherited;
// Just to illustrate that an Instance is being created...
NewInstanceOfInterfacedObject;
end;
destructor TContainingObject.Destroy;
var
I: Integer;
begin
for I := Low(FIObjectArray) to High(FIObjectArray) do
FIObjectArray[I] := nil;
SetLength(FIObjectArray, 0); // Array collapsed
inherited;
end;
procedure TContainingObject.NewInstanceOfInterfacedObject;
var
LIndex: Integer;
begin
LIndex := Length(FIObjectArray);
SetLength(FIObjectArray, LIndex + 1);
FIObjectArray[LIndex] := TMyInterfacedObject.Create;
end;
Okay, also eine Instanz von TContainingObject
erstellt wird, und erzeugt wiederum eine Instanz von TMyInterfacedObject
, gespeichert in einem Array von IMyInterface
.
Wenn TContainingObject
destructor
aufgerufen wird, ist es die Referenz und bricht das Array zusammen.
Das Problem, das ich habe, ist, dass, ohne andere Referenzen nirgendwo, TMyInterfacedObject
's destructor
wird nie aufgerufen, und damit Speicherlecks.
Mache ich etwas falsch, oder ist das Referenzzählsystem von Delphi nicht in der Lage, das einfache Konzept von Interfaced Objects zu bewältigen, das in einem Array des Interface-Typs gehalten wird?
Danke für jede Beratung!
Weitere Informationen
TContainingObject
bietet eine Array-Eigenschaft für die einzelnen Instanzen IMyInterface
im Array enthaltenen zuzugreifen.
In meinem tatsächlichen Code gibt es Zirkelverweise zwischen mehreren Schnittstellentypen. Angenommen, IMyInterface
enthält eine Funktion GetSomething: IAnotherInterface
, und IAnotherInterface
enthält GetMyInterface: IMyInterface
(eine Zirkularreferenz). Könnte das mein Problem verursachen? Wenn ja, ist die Kreisreferenz absolut erforderlich, also was wäre eine Lösung in diesem Sinne?
Haben Sie das gleiche Problem mit einer TInterfaceList anstelle eines Arrays? –
Ich habe noch nie TInterfaceList angeschaut.Ich werde jetzt einen Blick darauf werfen, aber ich würde wirklich lieber ein einfaches Array verwenden (um meine bestehenden "Managed Array" -Systeme zu nutzen) – LaKraven
Okay ... mein Array für 'TInterfaceList' ergänzt, und das Ergebnis ist genau das selbe: 'destructor' von' TMyInterfacedObject' wird nie aufgerufen, Speicherlecks! – LaKraven