如何在删除TList<>项目后正确释放内存?

3

使用 TList 作为记录容器。在应用程序中,TList 添加和删除大量的记录。但是,在 delete 后,属性 capacity 永远不会减少,内存也没有被释放。如何解决这个问题? 简单的代码示例:

type
  TMyRecord = record
    Num : integer;
    Str : String
  end;

var
  MyRecord : TMyRecord;
  MyList :TList<TMyRecord>;



  MyList := TList<TMyRecord>.Create;

  MyRecord.Num := 1;
  MyRecord.Str := 'abc';

  for i := 0 to 63 do
    begin
      MyList.Add(MyRecord);
    end;

  Memo1.Lines.Add('Before deleting');
  Memo1.Lines.Add('Count='+IntToStr(MyList.Count));
  Memo1.Lines.Add('Capacity='+IntToStr(MyList.Capacity));

  for i := 0 to 59 do
    begin
      MyList.Delete(0);
    end;

  MyList.Pack; // Here need to somehow free the memory.

  Memo1.Lines.Add('After deleting');
  Memo1.Lines.Add('Count='+IntToStr(MyList.Count));
  Memo1.Lines.Add('Capacity='+IntToStr(MyList.Capacity));
2个回答

5
根据TList.Pack的文档
该过程将从列表中删除任何具有默认值的T类值的项目。
您发布的代码表明您似乎认为这会减少列表的容量,但这不是此操作的目的。
相反,您应该使用TList.TrimExcess。 根据文档
TrimExcess将容量设置为计数,消除列表中所有多余的容量。

这正是我需要的。谢谢! - HeathRow
注意:Lazarus的“Capacity”帮助页面更好。Delphi的那个真的很令人困惑:https://www.freepascal.org/docs-html/rtl/classes/tlist.capacity.html - Gabriel

2

您可以编写

MyList.Capacity := MyList.Count;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接