当长度减少时,动态数组是否会自动释放?
Is a dynamic array automatically deallocated when length is decreased?
我已经知道,动态数组自动 deallocated/freed 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
另外,你的问题说明你没有正确理解这一点。您似乎相信当您的数组超出范围时,引用的标签将被自动销毁。 这是不正确的!
无论 some/all 动态数组条目在何处以及为何被释放 Delphi 都不会 自动销毁对象类型或任何动态分配的指针内存。 Delphi 仅自动释放基元(Integer
、TDateTime
、Double
短字符串)、记录和托管类型1(接口)的内存、长字符串、其他动态数组)。
1 当然这是通过引用计数。 IE。 reference减1;当且仅当 refCount
减为零时,基础 object/string/array 才会被释放。
正如 whosrdaddy 所指出的,如果你想自动销毁包含的对象,那么你需要使用一个实现所有权概念的容器。 TObjectList
就是一个例子。虽然它不像动态数组那样工作,但它的行为非常相似,通常可以很容易地用作替代品。
我已经知道,动态数组自动 deallocated/freed 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
另外,你的问题说明你没有正确理解这一点。您似乎相信当您的数组超出范围时,引用的标签将被自动销毁。 这是不正确的!
无论 some/all 动态数组条目在何处以及为何被释放 Delphi 都不会 自动销毁对象类型或任何动态分配的指针内存。 Delphi 仅自动释放基元(Integer
、TDateTime
、Double
短字符串)、记录和托管类型1(接口)的内存、长字符串、其他动态数组)。
1 当然这是通过引用计数。 IE。 reference减1;当且仅当 refCount
减为零时,基础 object/string/array 才会被释放。
正如 whosrdaddy 所指出的,如果你想自动销毁包含的对象,那么你需要使用一个实现所有权概念的容器。 TObjectList
就是一个例子。虽然它不像动态数组那样工作,但它的行为非常相似,通常可以很容易地用作替代品。