将本地动态数组的长度设置为零(不再需要时)是否具有使用内存的好处?
例如:
var
MyArray : array of string;
begin
<filling my array with a lot of items....>
<doing some stuffs with MyArray>
//from here on, MyArray is no more needed, should I set its length to zero?
SetLength(MyArray, 0);
<doing other stuffs which doesn't need MyArray...>
end;
在Delphi中,动态数组是按引用计数的。
因此,如果您这样做
MyArray := nil;
要么
Finalize(MyArray);
要么
SetLength(MyArray, 0);
该变量MyArray
将不再指向动态数组堆对象,因此其引用计数将减少1。如果这会使引用计数降至零,这意味着没有变量指向它,则它将被释放。
所以在
var
a: array of Integer;
begin
SetLength(a, 1024*1024);
// ...
SetLength(a, 0);
// ...
end
您将释放内存SetLength(a, 0)
,假设这a
是指向此堆对象的唯一变量。
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。
当然,在
var
a: array of Integer;
begin
SetLength(a, 1024*1024);
// ...
SetLength(a, 0);
end
最后一个调用SetLength
完全没有必要,因为a
无论如何局部变量都将超出下一行代码的作用域,这也减少了堆对象的引用计数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句