增加动态数组的大小会发生什么?

Sha*_*ews 9 delphi

我想了解当动态数组的大小增加时会发生什么.

到目前为止我的理解:

  • 现有的数组元素将保持不变.
  • 新数组元素初始化为0
  • 所有数组元素在内存中都是连续的.

当数组大小增加时,是将额外的内存添加到现有的内存块上,还是将现有的元素复制到一个全新的内存块?

更改动态数组的大小是否会影响引用现有数组元素的指针?

谢谢,

[编辑]错误的假设被打破了.(新数组元素初始化为0)

Mar*_*ema 10

  • 现有的数组元素将保持不变:是的
  • 新数组元素初始化为0:(请参阅更新),除非它是编译器管理类型的数组,如字符串,其他数组或变体
  • 所有数组元素在内存中都是连续的:是的

当数组大小增加时,将复制该数组.从doc:...为数组赋值或将其传递给SetLength过程时,将重新分配动态数组的内存.

所以,是的,增加动态数组的大小确实会对引用现有数组元素的指针产生影响.

如果要保留对现有元素的引用,请在数组中使用它们的索引(从0开始).

更新

Rob和David的评论促使我检查了Delphi5中动态数组的初始化(因为我还是可以随时使用).首先使用一些代码创建各种类型的动态数组并在调试器中检查它们.它们都已正确初始化,但这可能仍然是在分配它们的内存位置初始化之前的结果.所以检查了RTL.事实证明,D5已经在Dyn指向的DynArraySetLength方法中具有FillChar语句:

  // Set the new memory to all zero bits
  FillChar((PChar(p) + elSize * oldLength)^, elSize * (newLength - oldLength), 0);
Run Code Online (Sandbox Code Playgroud)