gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:07:23 24 4
gpt4 key购买 nike

将本地动态数组的长度设置为零(当不再需要时)对内存使用有好处吗?

例如:

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;

最佳答案

在德尔福中,dynamic arrays是引用计数的。

因此,如果你这样做

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 无论如何都会在下一行代码中超出范围,这也减少了引用计数堆对象。

关于arrays - 将本地动态数组的长度设置为零会减少内存使用量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64927600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com