在 Delphi 中,动态数组是引用计数的。
因此,如果你这样做
MyArray := nil;
或者
Finalize(MyArray);
或者
SetLength(MyArray, 0);
该变量MyArray
将不再指向动态数组堆对象,因此其引用计数将减少 1。如果这使引用计数降至零,这意味着没有变量指向它,它将被释放。
示例 1
所以在
var
a: array of Integer;
begin
SetLength(a, 1024*1024);
// ...
SetLength(a, 0);
// ...
end
你将释放内存SetLength(a, 0)
,假设a
是唯一指向这个堆对象的变量。
示例 2
var
b: TArray<Integer>;
procedure Test;
var
a: TArray<Integer>;
begin
SetLength(a, 1024*1024);
b := a;
SetLength(a, 0);
// ...
end
SetLength(a, 0)
不会释放任何内存,因为b
仍然是指原始数组。不过,它会将引用计数从 2 减少到 1。
示例 3
而且,当然,在
var
a: array of Integer;
begin
SetLength(a, 1024*1024);
// ...
SetLength(a, 0);
end
最后一次调用SetLength
完全没有必要,因为局部变量a
无论如何都会超出下一行代码的范围,这也减少了堆对象的引用计数。