Delphi 如何释放通用TList<;T>;?

Delphi 如何释放通用TList<;T>;?,delphi,Delphi,如何释放通用t列表 我知道我可以在创建时将TObjectList与AOwnsObjects=True一起使用 我很好奇,当T是非托管引用(指针或类)时,如何以通用方式重写以下方法,使其能够释放T 过程自由列表(const List:TList); 变量 i:整数; 开始 如果(List=nil),则 出口 对于i:=Pred(List.Count)下降到0 do 如果分配(列表[i]),则 TObject(列表[i])免费; 列表。清晰; 结束; 使用泛型版本,TObjectList您可以在过程

如何释放通用
t列表

我知道我可以在创建时将
TObjectList
AOwnsObjects=True
一起使用

我很好奇,当
T
是非托管引用(指针或类)时,如何以通用方式重写以下方法,使其能够释放
T

过程自由列表(const List:TList);
变量
i:整数;
开始
如果(List=nil),则
出口
对于i:=Pred(List.Count)下降到0 do
如果分配(列表[i]),则
TObject(列表[i])免费;
列表。清晰;
结束;

使用泛型版本,
TObjectList
您可以在过程中添加一个
T
泛型参数(然后必须将其放入类方法中才能使用泛型),并在对列表元素调用
Free()
之前,使用RTTI检查
T
是否为类类型

例如:

类型
ListUtils=class
公众的
类程序清除列表(const List:TList);
结束;
类过程ListUtils.ClearList(const List:TList);
类型
PObject=^TObject;
变量
i:整数;
值:T;
开始
如果(List=nil),则
出口
如果GetTypeKind(T)=tkClass,则
//对于没有GetTypeKind()的旧编译器:
//如果PTypeInfo(TypeInfo(T))^.Kind=tkClass,则
开始
对于i:=Pred(List.Count)下降到0 do
开始
值:=列表[i];
PObject(@Value)^.Free;
结束;
结束;
列表。清晰;
结束;
或者:

使用
Rtti;
类型
ListUtils=class
公众的
类程序清除列表(const List:TList);
结束;
类过程ListUtils.ClearList(const List:TList);
变量
i:整数;
开始
如果(List=nil),则
出口
如果GetTypeKind(T)=tkClass,则
//对于没有GetTypeKind()的旧编译器:
//如果PTypeInfo(TypeInfo(T))^.Kind=tkClass,则
开始
对于i:=Pred(List.Count)下降到0 do
TValue.From(列表[i]).AsObject.Free;
结束;
列表。清晰;
结束;
然后你可以这样使用它:

var
IntList:TList;
对象列表:TList;
开始
IntList:=TList.Create;
...
//不调用列表元素上的TObject.Free
ListUtils.ClearList(IntList);
IntList.Free;
ObjList:=TList.Create;
...
//调用列表元素上的TObject.Free
ListUtils.ClearList(ObjList);
对象列表。免费;
结束;

这不会释放列表,只是将其清除。为什么需要处理任意元素类型?使用
TObjectList
,没有更多的事情要做。相关:请参阅并感谢@Remy:如上所述,我的问题是出于简单的好奇而产生的,您的回答满足了它。不在柏林编译:两个错误。第一个是全局过程或函数自由列表中不允许的E2530类型参数,第二个是方法签名常量列表中E2003 udecared标识符“T”:TList@FabioVitale哦,是的,我一直忘了泛型不能在独立过程上工作的问题(我真的很讨厌这种限制)。因此,只需将过程改为
方法即可。我更新了我的答案,以显示hi@Remy,但我在TObject(List[I])Free行得到一个错误E2089 Invalid Typecast;非常感谢你@Remy:它很有魅力,现在我对整个事情有了更好的理解!