分配空数组和使用 SetLength(arr, 0) 有什么区别?

Mag*_*s W 1 delphi

清空数组时,以下替代方案之间是否有任何需要注意的区别?

假设arr是一个TArray<string>

  SetLength(arr, 0);
Run Code Online (Sandbox Code Playgroud)

或者

  arr := [];
Run Code Online (Sandbox Code Playgroud)

它们是相同的,但我的 Delphi 有点生疏了,我似乎记得在几个月前看似有效的代码之后,微妙的“特性”又回来困扰着我......

And*_*and 5

如果arr是动态数组变量,则

SetLength(arr, 0)
Run Code Online (Sandbox Code Playgroud)

arr := nil
Run Code Online (Sandbox Code Playgroud)

和新的(德尔福 XE7+)

arr := []
Run Code Online (Sandbox Code Playgroud)

都是等价的。

理解这种等价性的关键是SetLength文档中的以下部分:

调用 , 后SetLength保证S引用唯一的字符串或数组——即引用计数为 1 的字符串或数组。

另外,请记住,空动态数组由指针表示nil,而不是指向“长度为零的动态数组堆对象”的指针:

当变量为空(未初始化)或包含零长度数组时,指针为空,nil并且没有与该变量关联的动态内存。