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

sev*_*ven 8 arrays delphi string

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

SetLengthmyArr在这种情况下,分配16个字节的内存.

myArr : array of byte;

SetLength(myArr, 16);
Run Code Online (Sandbox Code Playgroud)

Van*_*mex 13

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

根据我的观察,对于静态数组,未初始化的元素包含随机数据.对于动态阵列,AFAIK因为Delphi 7中,未初始化元素包含它们的默认 没什么价值.但是,你不应该依赖这个事实,因为它是实现细节SetLength.您应该遵循官方文档.

  • 你能保证这样的行为会像Delphi的未来版本一样保留吗?有关Delphi 7的评论,请阅读第二段. (4认同)
  • 关于你的观察(我们这里不谈静态数组),它可能不够精确:每次调用SetLength()= DynArraySetLength代码时都会调用fillchar.所以"默认值"在这里始终为0. (2认同)

Lie*_*ers 7

在实践中,它被初始化为零.

该方法SetLength内部调用System.DynArraySetLength.
使用Delphi 5,内存充满了#0.

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

我假设在最近的Delphi版本中这种行为没有改变.