举行提供尽可能多的信息,我可以当,下面是我在做什么问题与释放接口对象数组中的
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;
好了,所以创建的TContainingObject
实例的非常简单的例子,并依次创建TMyInterfacedObject
的实例,存储在IMyInterface
的Array中。
当TContainingObject
的destructor
被调用时,它将无参考并折叠数组。
我遇到的问题是,没有其他任何地方参考,TMyInterfacedObject
的destructor
永远不会被调用,从而内存泄漏。
我做错了什么,或者是德尔福的引用计数系统无法应对接口类型数组中保存的接口对象的简单概念吗?
感谢您的任何建议!
更多信息
TContainingObject
提供一种阵列属性来访问包含在所述阵列内的IMyInterface
单个实例。
在我的实际代码中,多个接口类型之间有循环引用。 我们建议IMyInterface
包含一个函数GetSomething: IAnotherInterface
,并且IAnotherInterface
包含GetMyInterface: IMyInterface
(循环引用)。 这可能会导致我的问题?如果是这样,那么通常的参考文件是绝对需要,那么解决方法是什么?
你对TInterfaceList而不是数组有同样的问题吗? – 2012-04-03 00:02:53
我从来没有看过TInterfaceList。我现在来看看,但我真的更喜欢使用一个简单的数组(为了利用我现有的“Managed Array”系统) – LaKraven 2012-04-03 00:06:07
好吧...补充我的数组'TInterfaceList',结果就是相同:'TMyInterfacedObject'的'析构函数'永远不会被调用,内存泄漏! – LaKraven 2012-04-03 00:18:42