清空数组时,您应该注意以下几种选择之间的区别吗?
假设arr是TArray<string>:
arr
TArray<string>
SetLength(arr, 0);
或
arr := [];
我猜它们是一样的,但我的Delphi有点生 rust 了,我似乎记得在之前几个月看似有效的代码之后,微妙的“奇特”再次困扰着我……
hsvhsicv1#
如果arr是动态数组变量,则
SetLength(arr, 0)
和
arr := nil
和新的(Delphi XE7+)
arr := []
都是等同的。
理解这种等价性的关键是SetLength文档中的以下部分:在调用SetLength之后,S保证引用唯一的字符串或数组--即引用计数为1的字符串或数组。
SetLength
S
另外,回想一下,空的动态数组由nil指针表示,而不是指向“长度为零的动态数组堆对象”的指针:
nil
当变量为空(未初始化)或包含零长度数组时,指针为nil,且没有与变量关联的动态内存。
1条答案
按热度按时间hsvhsicv1#
如果
arr
是动态数组变量,则和
和新的(Delphi XE7+)
都是等同的。
理解这种等价性的关键是
SetLength
文档中的以下部分:在调用
SetLength
之后,S
保证引用唯一的字符串或数组--即引用计数为1的字符串或数组。另外,回想一下,空的动态数组由
nil
指针表示,而不是指向“长度为零的动态数组堆对象”的指针:当变量为空(未初始化)或包含零长度数组时,指针为
nil
,且没有与变量关联的动态内存。