如何释放通用 TList

2023-12-12

我怎样才能释放一个通用的TList<T>?

我知道我可以使用TObjectList with AOwnsObjects = True在创建它的同时。

我很好奇,如何以通用方式重写以下方法,以便它可以免费T when T是非托管引用,是指针还是类?

procedure FreeList(const List: TList);
var
  i: Integer;
begin
  if (List = nil) then
    Exit;
  for i := Pred(List.Count) downto 0 do
    if Assigned(List[i]) then
      TObject(List[i]).Free;
  List.Clear;
end;

您可以添加一个T过程的通用参数(然后必须将其制成类方法才能使用泛型),并使用 RTTI 检查是否T调用前是类类型Free()在您的列表元素上。

例如:

type
  ListUtils = class
  public
    class procedure ClearList<T>(const List: TList<T>);
  end;

class procedure ListUtils.ClearList<T>(const List: TList<T>);
type
  PObject = ^TObject;
var
  i: Integer;
  Value: T;
begin
  if (List = nil) then
    Exit;
  if GetTypeKind(T) = tkClass then
  // for older compilers that do not have GetTypeKind():
  // if PTypeInfo(TypeInfo(T))^.Kind = tkClass then
  begin
    for i := Pred(List.Count) downto 0 do
    begin
      Value := List[i];
      PObject(@Value)^.Free;
    end;
  end;
  List.Clear;
end;

或者:

uses
  ..., System.Rtti;

type
  ListUtils = class
  public
    class procedure ClearList<T>(const List: TList<T>);
  end;

class procedure ListUtils.ClearList<T>(const List: TList<T>);
var
  i: Integer;
begin
  if (List = nil) then
    Exit;
  if GetTypeKind(T) = tkClass then
  // for older compilers that do not have GetTypeKind():
  // if PTypeInfo(TypeInfo(T))^.Kind = tkClass then
  begin
    for i := Pred(List.Count) downto 0 do
      TValue.From<T>(List[i]).AsObject.Free;
  end;
  List.Clear;
end;

然后你可以像这样使用它:

var
  IntList: TList<Integer>;
  ObjList: TList<TSomeClass>;
begin
  IntList := TList<Integer>.Create;
  ...
  // does not call TObject.Free on list elements
  ListUtils.ClearList<Integer>(IntList);
  IntList.Free;

  ObjList := TList<TSomeClass>.Create;
  ...
  // calls TObject.Free on list elements
  ListUtils.ClearList<TSomeClass>(ObjList);
  ObjList.Free;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何释放通用 TList? 的相关文章

随机推荐

  • 如何检查Chrome开发工具是否打开? [复制]

    这个问题在这里已经有答案了 I found in the tutorial on codeschool com discover devtools http discover devtools codeschool com chapters
  • ansible - 组合三个字典列表

    在我的剧本中 我从多个来源收集有关应用程序的事实 最终得到 3 个 或更多 列表 每个列表都有一个字典 有没有一种方法可以将这种结构合并到一个字典列表中 如果没有 关于我需要如何更改数据结构有什么建议吗 我尝试结合的代码2 字典列表 即使在
  • 从 csv 打印第一列时出现 Python 'KeyError: 0'

    我是 python 新手 尝试按列索引读取每一行 但得到KeyError 0执行以下代码时 with open processed test csv as f reader csv DictReader f for row in reade
  • 处理多态对象集合的正确设计模式

    假设我有以下课程 class BaseObject public virtual int getSomeCommonProperty class Object1 public BaseObject public virtual int ge
  • Python从项目列表创建字典键

    我希望使用 Python 字典来跟踪一些正在运行的任务 这些任务中的每一个都有许多使其独一无二的属性 因此我想使用这些属性的函数来生成字典键 以便我可以使用相同的属性再次在字典中找到它们 像下面这样 class Task object de
  • Spring Boot War 在 Jboss 7.1 上不起作用

    我正在尝试在 Jboss 上部署 Spring boot 应用程序 我跟随this将我的 jar 转换为 war 文件的教程 但是当我尝试在 Jboss 上运行应用程序时 它给了我这个错误 17 02 31 462 ERROR org ap
  • 如何让一个数成为幂呢?

    我的 JavaScript 有这个 A B C 其他的我都有了 但是我怎样才能有C作为力量呢 我认为使用 会起作用 但它只是添加它 JavaScript 没有求幂运算符 实际上是按位异或运算符 尝试使用Math pow反而 var d Ma
  • iOS 应用程序生命周期 4/3GS/iPad 与 2G/3G

    我读过苹果的文档关于应用程序生命周期并进行了一些测试以了解不同设备上的应用程序生命周期 除 2G 外均运行 iOS 4 x 我已经测试了具有 多任务处理 功能的设备与一些不支持此功能的设备 iPhone 2G 3G 应用程序生命周期 STA
  • 使用 python 编译 pin 工具时出错,出现错误 C2872:“UINT32”:不明确的符号

    我正在尝试编译 pin 工具Python h我收到了超过 100 个关于不明确符号的错误 我试图分开include到不同的命名空间 但它产生了许多其他错误 包含时也会发生同样的情况windows h 所有错误看起来都是这样的 D proj
  • 为什么这个承诺会悄然落空?

    db collection findOne是一个异步操作 MongoDB 但这在这里并不重要 这就是为什么我在这里将它包装在一个承诺中 var letsDoSomething new Promise function resolve rej
  • 代码可以在 jsfiddle 中运行,但不能在 html 文档中运行

    我是 javascript 的初学者 希望有人能帮助我解决这个问题 我正在尝试制作一个带有 id 的 div 移动 来回滑动 该代码在 jsfiddle 中工作 但当我将其放入 html 文档中时将无法工作 我尝试将顶部部分放在单独的 js
  • MySQL:从表中选择日期位于当前周和当前月的数据

    我正在创建一个网络应用程序 如果用户单击名为 WEEK 的链接 该页面会显示该周提交的所有帖子 还有一个选项可以查看本月提交的所有帖子 posts 表中有一个名为 post date 的列 其中日期的存储格式为 YYYY MM DD 我的问
  • Nodejs HTTP 和 HTTPS 通过同一端口

    我一直在谷歌搜索并在 stackoverflow 上查看 但找不到我喜欢的答案 我有一个通过 HTTPS 和端口 3001 运行的 NodeJS 服务器 现在我想获取端口 3001 上的所有传入 HTTP 请求 并将它们重定向到相同的 UR
  • 为什么使用切片克隆列表会影响原始列表

    下面是我将数组内的对象更改为字符串的代码 无法弄清楚为什么它会影响原始数组 slice 应该克隆数组 如果我是对的 var cloned scope selected items slice 0 cloned forEach functio
  • Hibernate - 外键而不是实体

    目前 Hibernate 允许我直接加载由 一对一关系定义的对象 entity1 getEntity2 是否可以获取外键而不是对象 我看到的当前方法是添加到我的映射中 JoinColumn name message key ManyToOn
  • 使用 while 循环遍历数组? - MIPS [重复]

    这个问题在这里已经有答案了 我想循环遍历一个数字数组 例如 word 2 2 2 2 2 2 2 2 2 2 2 2 2 word 2 2 2 2 2 2 2 2 2 2 2 2 2 word 2 2 2 2 2 2 2 2 2 2 2 2
  • Jenkins 使用 Groovy 读取 Jenkinsfile 中文件的特定行

    我正在尝试读取某行的特定行html詹金斯中的文件stage with Groovy并将其内容保存到环境变量中 问题是 File and readLines 不允许 我能够加载文件 env WORKSPACE pwd def file rea
  • PostgreSQL 交叉表查询

    如何在 PostgreSQL 中创建交叉表查询 例如我有下表 Section Status Count A Active 1 A Inactive 2 B Active 4 B Inactive 5 我希望查询返回以下交叉表 Section
  • 短的、不区分大小写的字符串混淆策略

    我正在寻找一种识别方法 即编码and解码 一组带有一个标记的 Java 字符串 识别不应涉及数据库持久化 到目前为止 我已经研究了 Base64 编码和 DES 加密 但对于以下要求而言 两者都不是最佳的 Token应该尽可能短 令牌应该对
  • 如何释放通用 TList

    我怎样才能释放一个通用的TList