【发布时间】:2018-09-05 09:42:31
【问题描述】:
在使用 FastMM4 时,函数 DynArraySetLength 中的 system.pas 存在内存泄漏。我正在使用一个列表,其中每个元素都有 5 条记录。这些记录又是几百万的顺序列表。因此,小的内存泄漏累积成巨大的块。
在释放元素时,我故意使用 SetLength(x,0) 和 x:=nil。 但是,system.pas 的 DynArraySetLength 中仍然存在内存泄漏。 有人可以建议我如何使用有效的方式释放数组并解决此内存泄漏问题。
提前致谢
代码: 内存泄漏发生在此过程的 SetLength
procedure TElem.Assign(Value: TElem);
begin
SetLength(Self.aXY.points, Length(Value.aXY.points)); //MEMORY LEAK
Move(Value.aXY.points[0], Self.aXY.points[0],
Length(Value.aXY.points) * SizeOf(coordinate));
end;
释放时我正在使用这个程序:
procedure TElem.FreeElem;
begin
SetLength(Self.aXY.points,0);
Self.aXY.points:=nil;
end;
【问题讨论】:
-
x声明及其他相关代码在哪里? -
没有实际代码是不可能回答这个问题的。
-
内存泄漏发生在此过程的 SetLength TElem.Assign(Value: TElem);开始设置长度(Self.aXY.points,长度(Value.aXY.points));移动(Value.aXY.points[0],Self.aXY.points[0],长度(Value.aXY.points)* SizeOf(坐标));结尾;释放时我正在使用这个程序:procedure TElem.FreeElem;开始 SetLength(Self.aXY.points,0); Self.aXY.points:=nil;结束;
-
Move是低级程序。它没有处理数组元素中正确管理的类型......但我们仍然对元素一无所知。 -
请添加其他人已经要求的声明,并解释您如何知道存在内存泄漏以及仅在一次数组分配/释放后泄漏的大小是多少?
标签: arrays delphi memory record pascal