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

WeG*_*ars 4 memory delphi 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;
Run Code Online (Sandbox Code Playgroud)

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

LU *_* RD 14

阅读Embarcadero的文档:

procedure SetLength(var S: <string or dynamic array>; NewLength: Integer);
Run Code Online (Sandbox Code Playgroud)

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

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


如果你想清除整个动态数组,而不仅仅是分配更多的项目和保留现有的项目,只需要调用SetLengthNewLength = 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;
Run Code Online (Sandbox Code Playgroud)

  • 和.如果要确保将已存在的动态数组的大小设置为将所有元素归零,则可能需要在设置为所需长度之前使用NewLength = 0设置SetLength,以避免保留现有的非零元素. (4认同)