在 Delphi 中,我应该释放 "array of array of" 变量吗?
In Delphi should I free "array of array of" variables?
假设我有一个 class 字段
a : array of array of double;
它是使用嵌套的 SetLength 调用分配的。
SetLength(a,100);
for i := 0 to length(a)-1 do SetLength( a[i], 100 );
在对象 Destroy 上是否需要循环遍历第一级数组以释放它的第二级项目?
for i := 0 to length(a)-1 do a[i] := NIL;
是否有必要,或者编译器也处理多维动态数组的释放?
Dynamic arrays 由编译器管理。当动态数组的引用计数降为零时,它会自动释放。
这同样适用于 multidimensional dynamic arrays 任何维度的每个级别。
因此,当您的字段 a
超出范围时,此动态数组的引用计数将减一。如果新的引用计数为零,则释放数组,因此所有元素 a[0]
、a[1]
、...、a[High(a)]
的引用计数都减一。而且,同样,如果它们达到零,它们也会被释放。
您不需要做任何事情。
您可以通过单个 SetLength()
调用设置多维动态数组的大小。无需使用任何循环。
你只需调用
SetLength(DynamicArray, FirstDimensionSize, SecondDimensionSize, ..NthDimensionSize)
.
因此,在您的情况下,您可以通过简单地使用以下方法设置动态数组的初始大小:
SetLength(a,100,100);
然后在释放数组时,您只需调用:
SetLength(a,0,0);
假设我有一个 class 字段
a : array of array of double;
它是使用嵌套的 SetLength 调用分配的。
SetLength(a,100);
for i := 0 to length(a)-1 do SetLength( a[i], 100 );
在对象 Destroy 上是否需要循环遍历第一级数组以释放它的第二级项目?
for i := 0 to length(a)-1 do a[i] := NIL;
是否有必要,或者编译器也处理多维动态数组的释放?
Dynamic arrays 由编译器管理。当动态数组的引用计数降为零时,它会自动释放。
这同样适用于 multidimensional dynamic arrays 任何维度的每个级别。
因此,当您的字段 a
超出范围时,此动态数组的引用计数将减一。如果新的引用计数为零,则释放数组,因此所有元素 a[0]
、a[1]
、...、a[High(a)]
的引用计数都减一。而且,同样,如果它们达到零,它们也会被释放。
您不需要做任何事情。
您可以通过单个 SetLength()
调用设置多维动态数组的大小。无需使用任何循环。
你只需调用
SetLength(DynamicArray, FirstDimensionSize, SecondDimensionSize, ..NthDimensionSize)
.
因此,在您的情况下,您可以通过简单地使用以下方法设置动态数组的初始大小:
SetLength(a,100,100);
然后在释放数组时,您只需调用:
SetLength(a,0,0);