You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中SetLength(arr,0)与arr:=[]清空数组的差异疑问

Delphi中TArray清空方式的差异

对于TArray<string>类型的动态数组,SetLength(arr, 0)和arr := []两种清空方式存在关键差异,核心源于动态数组的引用类型特性:

1. 对实例的操作逻辑不同

  • SetLength(arr, 0):直接修改当前变量指向的已有数组实例,将其长度设置为0,同时释放该实例中所有字符串元素占用的内存。如果有其他变量也指向这个实例,所有变量都会同步看到数组变为空。
  • arr := []:创建一个全新的空数组实例,并让变量arr指向这个新实例。原数组实例如果还有其他引用,不会被修改(原实例的元素内存也不会被释放,直到所有指向它的变量都不再引用它)。

2. 示例场景对比

当存在多个变量共享数组引用时,差异会直接显现:

var
  arr1, arr2: TArray<string>;
begin
  arr1 := ['hello', 'world'];
  arr2 := arr1; // arr1和arr2指向同一个数组实例

  // 使用SetLength的情况
  SetLength(arr1, 0);
  // 此时arr2的长度也变为0,原数组的元素内存已被释放

  // 改用赋值[]的情况
  arr1 := ['hello', 'world'];
  arr2 := arr1;
  arr1 := [];
  // 此时arr1指向新的空数组,arr2仍然指向原['hello','world']数组,原元素内存未被释放
end;

3. 特殊情况:变量原本为nil

如果arr初始为nil,两种写法的结果一致:都会让arr指向一个长度为0的数组实例(而非保持nil)。

内容的提问来源于stack exchange,提问作者Magnus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:45:41