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
相关产品推荐
相关产品推荐

