将本地动态数组的长度设置为零会减少内存使用吗?

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)

And*_*and 6

在 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。如果这使引用计数降为零,意味着没有变量指向它,它将被释放。

示例 1

所以在

MyArray := nil;
Run Code Online (Sandbox Code Playgroud)

您将释放内存SetLength(a, 0)假设a是指向此堆对象的唯一变量

示例 2

Finalize(MyArray);
Run Code Online (Sandbox Code Playgroud)

SetLength(a, 0)不会释放任何内存,因为b仍参照原来的数组。不过,它会将引用计数从 2 减少到 1。

示例 3

而且,当然,在

SetLength(MyArray, 0);
Run Code Online (Sandbox Code Playgroud)

最后一次调用SetLength完全没有必要,因为a无论如何局部变量都会超出下一行代码的作用域,这也减少了堆对象的引用计数。