gpt4 book ai didi

delphi - 当长度减少时,动态数组是否会自动释放?

转载 作者:行者123 更新时间:2023-12-02 12:49:44 30 4
gpt4 key购买 nike

我已经知道,动态数组会自动释放/释放 after use 。这同样适用于调整大小,尤其是减小大小吗?手册和大多数帮助站点仅涉及增加数组大小。

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

最佳答案

are entries 3-10 are automatically destroyed?

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

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

I alread know, that a dynamic array is automatically deallocated/freed after use

另外,你的问题说明你没有正确理解这一点。看来您相信当您的数组超出范围时,引用的标签将被自动销毁。 这是错误的!

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

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

<小时/>

正如 whosrdaddy 指出的那样,如果您希望自动销毁所包含的对象,那么您需要使用实现所有权概念的容器。 TObjectList 就是一个例子。尽管它的工作方式与动态数组不完全相同,但其行为非常相似,因此通常可以非常轻松地用作替代品。

关于delphi - 当长度减少时,动态数组是否会自动释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48924518/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com