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

Delphi 当长度减少时,动态数组是否自动解除分配?,delphi,memory-leaks,dynamic-arrays,Delphi,Memory Leaks,Dynamic Arrays,我知道,动态数组是自动解除分配/释放的。 是否同样适用于调整大小,尤其是减少?手册和大多数帮助站点仅涉及增加阵列大小 test: array of TLabel; SetLength(test, 10); // fill array here SetLength(test, 2); // <=== are entries 3-10 are automatically destroyed? test:TLabel的数组; 设定长度(试验,10); //在这里填充数组 设置长度(测试

我知道,动态数组是自动解除分配/释放的。 是否同样适用于调整大小,尤其是减少?手册和大多数帮助站点仅涉及增加阵列大小

test: array of TLabel;
SetLength(test, 10);
// fill array here
SetLength(test, 2);     // <=== are entries 3-10 are automatically destroyed?
test:TLabel的数组;
设定长度(试验,10);
//在这里填充数组
设置长度(测试,2);//
条目3-10是否自动销毁

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

我还必须指出,从技术上讲,“3-10”项是错误的。动态数组是基于零的。因此,条目2到9的引用是发布的引用

我知道,动态数组在使用后会自动解除分配/释放

此外,你的问题表明你没有正确理解这一点。您似乎认为,当数组超出范围时,引用的标签将自动销毁这是不正确的

无论在何处以何种方式或为何方式发布某些/所有动态数组项,Delphi都不会自动销毁对象类型或任何动态分配的指针内存。Delphi仅自动释放原语(
Integer
TDateTime
Double
短字符串)、记录和托管类型1(接口、长字符串、其他动态数组)的内存

1当然,这是通过引用计数实现的。即参考值减少1;当且仅当
refCount
减少到零时,才释放底层对象/字符串/数组



正如whosrdaddy所指出的,如果您想要自动销毁包含的对象,那么您需要使用实现所有权概念的容器
TObjectList
就是一个例子。虽然它的工作原理与动态数组不同,但其行为非常相似,因此通常可以很容易地将其用作替代品。

好吧,您需要小心这里的意思。这是一个指针数组,因此数组本身的内存是受管理的,但这并不意味着它指向的内容也会被破坏。因此,不会自动释放TLabel对象。事实上,如果他们是这样的话,那将是非常危险的!好的,我明白了。谢天谢地,我一点也不清楚你在问什么。您需要编辑问题以澄清您的意思。@casiosmu:如果您需要该功能,您需要TObjectlist或TObjectlist就像不会自动创建TLabel对象一样,它们也不会自动释放,除非您的编译器具有ARC for对象,例如,移动或Linux编译器。我认为有必要强调的是,对象引用的内存(最终)被释放,而不是它们引用的对象。这只发生在托管引用中。除非您在ARC下,否则对象引用也是一种基本类型(实际上是指针)。@Rudy立即而不是最终。它在调用SetLength时被释放。@david:只有在SetLength实际导致新的分配时才释放。如果dynarray真的被缩短了,我不太确定是否会发生这种情况。@Rudy否。内存被释放的意思是程序不再可以使用它。内存管理器可能会在幕后进行某些优化,但这些都是实现细节。内存管理器与此无关。像DynArraySetLength这样的System.pas代码控制内存。它不一定被释放(返回内存管理器),因此我最终使用了。