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

最佳答案

documentation on TList.Pack


  此过程从列表中删除类别T的任何项目,其值为T的默认值。


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

您应该使用的是TList.TrimExcessFrom the docu


  TrimExcess将“容量”设置为“计数”,从而消除列表中的所有多余容量。

关于delphi - 删除TList <>项目后如何正确释放内存?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42458225/

10-08 22:41