在Delphi中与SetLength一起使用时,动态数组的内存中有什么?

时间:2010-10-21 06:19:28

标签: arrays string delphi

我有一个动态数组myArr。当我们使用myArr时,SetLength中的内存中存储了什么?是'00'吗?还是未定义?

在这种情况下,

SetLengthmyArr分配16个字节的内存。

myArr : array of byte;

SetLength(myArr, 16);

2 个答案:

答案 0 :(得分:13)

引用Delphi 7帮助,“对于长字符串或动态数组变量,SetLength S 引用的字符串或数组重新分配给给定的长度。 保留数组中的字符串,但新分配的空间的内容未定义。一个例外是增加动态数组的长度,其中元素是必须初始化的类型(字符串,变体,变体数组或包含此类型的记录)。当 S 是必须初始化的动态类型数组时,新分配的空间将设置为0nil。“

根据我的观察,对于静态数组,未初始化的元素包含随机数据。对于动态数组,自Delphi 7以来的AFAIK,未初始化的元素包含默认值 nothing 值。但是,您不应该依赖这个事实,因为它是SetLength的实现细节。您应该遵循官方文档。

答案 1 :(得分:7)

实际上,它是用零的初始化。

方法SetLength内部调用System.DynArraySetLength 使用Delphi 5,内存会被#0填充。

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

我认为在最近的Delphi版本中这种行为没有改变。