【问题标题】:What needs finalization in a multidimensional dynamic array?在多维动态数组中需要完成什么?
【发布时间】:2009-09-16 13:14:02
【问题描述】:

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

我最近有理由使用动态数组,其中每个数组元素本身可以包含可变数量的元素。声明是这样的:

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

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

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

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

Finalize(MyArray);

或者每个数组元素也需要Finalized,因为每个元素本身就是一个动态数组?

【问题讨论】:

    标签: delphi arrays


    【解决方案1】:

    引用"你在主数组上调用 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;
    

    【讨论】:

    • 谢谢,知道这很有用。
    • 虽然如果您的数组不是矩形,这不起作用。 (此外,虽然很有趣,但这不是问题的答案。)
    【解决方案2】:

    数组由编译器管理,不需要最终确定。如果 TShiftType 是一个类,则必须手动释放对象,一次一个,但数组本身会在超出范围时被正确处理。

    【讨论】:

    • 啊,是的,我在 Delphi 帮助中看到“如果在对 Finalize 的调用中指定的变量不包含长字符串、变体或接口,编译器将消除该调用并且不为其生成任何代码。” TShiftType 是枚举类型,因此没有对象。所以这段时间我一直很小心地调用 Finalize,编译器一直在消除调用?!
    • 是的!动态数组和记录为您处理。
    【解决方案3】:

    要释放任何动态数组,只需将其分配给 nil 例如:

    a:array of array of integer;
    

    免费使用:

    a:=nil;  
    

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 2013-10-21
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多