当长度减少时,动态数组是否会自动解除分配?

时间:2018-02-22 10:02:47

标签: delphi memory-leaks dynamic-arrays

我知道,动态数组会自动解除分配/释放after use。 这同样适用于调整大小,尤其是减少吗?手册和大多数帮助网站仅涵盖增加阵列大小。

test: array of TLabel;
SetLength(test, 10);
// fill array here
SetLength(test, 2);     // <=== are entries 3-10 are automatically destroyed?

1 个答案:

答案 0 :(得分:3)

  

条目3-10会自动销毁吗?

不,它们不会自动销毁,因为这些条目是动态分配的(且不是托管类型)。仅释放引用这些项的指针。如有必要, 责任销毁这些项目,因为编译器无法保证您不会再使用其他参考文件(或已经销毁)它们)。

我还必须指出技术上的项目&#34; 3-10&#34;是错的。动态数组基于零。因此, 2到9 条目的引用是已发布的条目。

  

我知道,使用后会自动释放/释放动态数组

此外,您的问题表明您没有正确理解这一点。您似乎相信当阵列超出范围时,引用的标签将自动销毁。 这是不正确的!

无论在何处或为何发布部分/全部动态数组条目,Delphi 赢得 会自动销毁对象类型或任何动态分配的指针内存。 Delphi只为基元(IntegerTDateTimeDouble短字符串),记录和托管类型 1 (接口,长字符串,其他动态数组)自动释放内存)。

1 当然这是通过引用计数。即参考减少1;当且仅当refCount减少为零时,才会释放基础对象/字符串/数组。

正如whosrdaddy所指出的,如果你想要自动销毁所包含的对象,那么你需要使用一个实现所有权概念的容器。 TObjectList就是一个例子。虽然它的工作方式与动态数组完全不同,但它的行为足够相似,通常可以很容易地用作替换。