如何创建一个像SetLength这样的程序,它也会将内存归零?

时间:2016-10-10 14:14:14

标签: delphi memory initialization

在某些情况下,我需要设置动态数组的大小,然后用零填充它。

类似的东西:

procedure SetLengthAndZero(VAR X; NewSize: Integer);
begin
   SetLength(x, newsize);
   if newsize > 0
   then FillChar(x[0], length(x)* SizeOf(x[0]), 0);
end;

但上面的代码(显然)不会编译。

1 个答案:

答案 0 :(得分:14)

阅读Embarcadero的documentation

procedure SetLength(var S: <string or dynamic array>; NewLength: Integer);
     

对于动态数组变量,SetLength将S引用的数组重新分配给给定的长度。保留数组中的现有元素,并将新分配的空间设置为0或nil。

这意味着SetLength就是你想要的。

如果要清除整个动态数组,不只是分配更多项目并保留现有项目,只需使用SetLength调用NewLength = 0,然后再调用所需长度。

通用解决方案:

Type
  TDynArrayTool = record
    class procedure ClearAndSetLength<T>( var arr : TArray<T>; newLen : Integer); static;
  end;

class procedure TDynArrayTool.ClearAndSetLength<T>(var arr: TArray<T>;
  newLen: Integer);
begin
  Setlength(arr,0);
  SetLength(arr,newLen);
end;