我知道,动态数组会自动解除分配/释放after use。 这同样适用于调整大小,尤其是减少吗?手册和大多数帮助网站仅涵盖增加阵列大小。
test: array of TLabel;
SetLength(test, 10);
// fill array here
SetLength(test, 2); // <=== are entries 3-10 are automatically destroyed?
答案 0 :(得分:3)
条目3-10会自动销毁吗?
不,它们不会自动销毁,因为这些条目是动态分配的(且不是托管类型)。仅释放引用这些项的指针。如有必要, 责任销毁这些项目,因为编译器无法保证您不会再使用其他参考文件(或已经销毁)它们)。
我还必须指出技术上的项目&#34; 3-10&#34;是错的。动态数组基于零。因此, 2到9 条目的引用是已发布的条目。
我知道,使用后会自动释放/释放动态数组
此外,您的问题表明您没有正确理解这一点。您似乎相信当阵列超出范围时,引用的标签将自动销毁。 这是不正确的!
无论在何处或为何发布部分/全部动态数组条目,Delphi 赢得 会自动销毁对象类型或任何动态分配的指针内存。 Delphi只为基元(Integer
,TDateTime
,Double
短字符串),记录和托管类型 1 (接口,长字符串,其他动态数组)自动释放内存)。
1 当然这是通过引用计数。即参考减少1;当且仅当refCount
减少为零时,才会释放基础对象/字符串/数组。
正如whosrdaddy所指出的,如果你想要自动销毁所包含的对象,那么你需要使用一个实现所有权概念的容器。 TObjectList
就是一个例子。虽然它的工作方式与动态数组完全不同,但它的行为足够相似,通常可以很容易地用作替换。