Fab*_*zio 2 arrays delphi memory-management memory-optimization
将本地动态数组的长度设置为零(不再需要时)是否对内存使用有好处?
例如:
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;
Run Code Online (Sandbox Code Playgroud)
在 Delphi 中,动态数组是引用计数的。
因此,如果你这样做
MyArray := nil;
Run Code Online (Sandbox Code Playgroud)
或者
Finalize(MyArray);
Run Code Online (Sandbox Code Playgroud)
或者
SetLength(MyArray, 0);
Run Code Online (Sandbox Code Playgroud)
该变量MyArray将不再指向动态数组堆对象,因此其引用计数将减 1。如果这使引用计数降为零,意味着没有变量指向它,它将被释放。
所以在
MyArray := nil;
Run Code Online (Sandbox Code Playgroud)
您将释放内存SetLength(a, 0),假设a是指向此堆对象的唯一变量。
Finalize(MyArray);
Run Code Online (Sandbox Code Playgroud)
SetLength(a, 0)会不会释放任何内存,因为b仍参照原来的数组。不过,它会将引用计数从 2 减少到 1。
而且,当然,在
SetLength(MyArray, 0);
Run Code Online (Sandbox Code Playgroud)
最后一次调用SetLength完全没有必要,因为a无论如何局部变量都会超出下一行代码的作用域,这也减少了堆对象的引用计数。