如何释放TList<array of records>? [已关闭]

问题描述 投票:0回答:1

我有一个程序需要使用

TList<array of records>
。使用完后,我想释放该列表。如果我使用普通的
.Free
那么我会释放列表,但不会释放其中的记录,并且我会出现内存泄漏。这就是为什么我尝试先释放
TList
中的每条记录,然后再释放
TList
。我尝试在互联网上阅读如何做到这一点,发现了 2 个类似但不完全相同的解决方案。

这是我的记录:

type TTestRecord = record
  value : word;
  isTrue : boolean;
end;

这是我的记录数组:

type
  TResultRecordArray = array[0..70] of TTestRecord;

这是我的 TList:

TList<TResultRecordArray>

我尝试了两种不同的解决方案,但都不起作用。我认为他们不起作用的原因是因为他们都没有在

array of records
 中使用 
TList

第一个解决方案:

for i := 0 to List.Count - 1 do  
begin;
  TObject(List[i]).Free;
end;

这似乎有正确的逻辑,但我在这里收到错误“无效类型转换” -

TObject(List[i]).Free

第二种解决方案:

procedure ClearList(List: TStringList);
var
  i: Integer;
begin
  for i := 0 to pred(List.Count) do
    List.Objects[i].Free;       
  List.Clear;
end;

我完成程序后,我这样称呼它:

ClearList(List);

编译后出现错误

Incompatible types: 'TStringList' and 'System.Generics.Collections.TList<FileUtils.TResultRecordArray>'

然后我最终尝试用我的

TList
而不是
TStringList
更改第二个解决方案,最终看起来像这样:

procedure ClearList(List: TList<TKeycodeRecord>);
var
  i: Integer;
begin
  for i := 0 to pred(List.Count) do
    List.Objects[i].Free;
  List.Clear;
end;

这段代码给了我这个错误 -

Undeclared Identifier 'Objects'

那么,我应该如何正确释放“带有记录数组的TList”,而不发生内存泄漏。

arrays delphi record tlist
1个回答
5
投票

使用完毕后,我想释放该列表。如果我使用普通的 .Free 那么我将释放列表,但不会释放其中的记录,并且我将出现内存泄漏。

你怎么知道你会发生内存泄漏?您是否尝试过在您的

dpr
文件中使用它?

ReportMemoryLeaksOnShutdown := True;

记录是值类型,它们的内存是自动管理的,您不需要释放它们的内存。静态和动态分配的数组也会自动管理,因此如果您的列表包含记录数组,则也不需要释放该数组。

要释放保存记录的列表或保存记录数组,您只需要释放列表即可。

var
  List: TList<TResultRecordArray>;
begin
  List := TList<TResultRecordArray>.Create;
  try
    ...
  finally
    List.Free;
  end;
end;

如果在任何时候,您只想从此类列表中清除添加的项目,您只需调用

List.Clear
。同样,这些项目的内存将被自动管理,并且不会发生泄漏。

© www.soinside.com 2019 - 2024. All rights reserved.