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



使用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));

来自 TList.Pack上的文档:

此过程从列表中删除了t类的任何项目,其值为t。

的默认值

您发布的代码表明您似乎认为这会减少列表Capacity,但这不是。

您应该使用的是TList.TrimExcess。来自文档:

trimexcess设置了计算能力,摆脱了列表中的所有超额容量。

你可以写

MyList.Capacity := MyList.Count;

最新更新