我有一个程序需要使用
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”,而不发生内存泄漏。
使用完毕后,我想释放该列表。如果我使用普通的 .Free 那么我将释放列表,但不会释放其中的记录,并且我将出现内存泄漏。
你怎么知道你会发生内存泄漏?您是否尝试过在您的
dpr
文件中使用它?
ReportMemoryLeaksOnShutdown := True;
记录是值类型,它们的内存是自动管理的,您不需要释放它们的内存。静态和动态分配的数组也会自动管理,因此如果您的列表包含记录数组,则也不需要释放该数组。
要释放保存记录的列表或保存记录数组,您只需要释放列表即可。
var
List: TList<TResultRecordArray>;
begin
List := TList<TResultRecordArray>.Create;
try
...
finally
List.Free;
end;
end;
如果在任何时候,您只想从此类列表中清除添加的项目,您只需调用
List.Clear
。同样,这些项目的内存将被自动管理,并且不会发生泄漏。