多维动态数组需要最终化什么?

3

我经常使用动态数组,并且在 SetLength 和 Finalize 过程中没有任何问题。

最近,我需要使用动态数组,其中每个数组元素本身可以包含多个变量。声明如下:

TScheduleArray =  array of array of array [1..DaysPerWeek] of TShiftType;

软件运行良好,我对如何使用这个结构没有问题。你需要在主数组上调用SetLength,然后可以在每个数组元素上再次调用SetLength。这正如预期的那样工作。

SetLength(MyArray, 1);
SetLength(MyArray[0], 2);

我的问题是:当我要释放用于该数组的资源时,我是否只需在数组变量上调用Finalize

Finalize(MyArray);

或者每个数组元素也需要进行Finalize,因为每个元素本身都是一个动态数组?
3个回答

6

引用:

“您可以在主数组上调用SetLength, 然后可以在每个数组元素上再次调用SetLength。”

您不需要遍历数组。

SetLength() 接受每个维度的长度列表。

示例:

SetLength(ScheduleArray,200,15,35);

等同于:

SetLength(ScheduleArray,200);
for i:=low(ScheduleArray) to high(ScheduleArry) do
begin
  SetLength(ScheduleArray[i],15);
  for j:=low(ScheduleArray[i]) to high(ScheduleArray[i]) do
    SetLength(ScheduleArray[i,j],35);
end;

谢谢,知道这个很有用。 - J__
虽然这种方法在数组不规则的情况下无法使用。(此外,尽管有趣,但它并不是问题的答案。) - Richard A

5

数组由编译器管理,不需要进行最终处理。如果TShiftType是一个类,则需要逐个手动释放对象,但是当数组超出范围时,它本身将被正确处理。


啊,我在 Delphi 帮助文档中看到了这句话:“如果在对 Finalize 的调用中指定的变量不包含长字符串、变体或接口,则编译器会消除该调用并不生成任何代码。”TShiftType 是一个枚举类型,因此没有对象。所以,所有这段时间我都小心翼翼地调用 Finalize,而编译器却一直在消除这个调用?! - J__
1
没错!动态数组和记录已经为您处理好了。 - Mason Wheeler

1
释放任何动态数组只需将其分配为nil 例如:
a:array of array of integer;

要释放它,请使用:

a:=nil;  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接