Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Delphi中使用SetLength()时,释放内存的正确方法是什么?_Arrays_Delphi - Fatal编程技术网

Arrays 在Delphi中使用SetLength()时,释放内存的正确方法是什么?

Arrays 在Delphi中使用SetLength()时,释放内存的正确方法是什么?,arrays,delphi,Arrays,Delphi,我最近在看一些使用SetLength为字节数组分配内存的代码,但我没有看到任何释放内存空间的逻辑。我已经读到,对于字节数组,您应该将值设置为nil或使用Finalize 处理这个问题的最好方法是什么。。。根据我的发现,它建议如下 var x: array of byte; begin SetLength(x, 30); // Do something here : // Release the array x := nil; Finalize(x); end; 通常

我最近在看一些使用SetLength为字节数组分配内存的代码,但我没有看到任何释放内存空间的逻辑。我已经读到,对于字节数组,您应该将值设置为nil或使用Finalize

处理这个问题的最好方法是什么。。。根据我的发现,它建议如下

var
  x: array of byte;
begin
  SetLength(x, 30);
  // Do something here
  :
  // Release the array
  x := nil;
  Finalize(x);
end;

通常,您根本不需要释放内存,因为这是在标识符(在本例中为
x
)超出范围时自动完成的。因此,代码中的最后两行完全没有意义


但是,如果您的标识符在程序关闭之前没有超出范围,那么您可能希望手动释放与其关联的内存。特别是,如果标识符是大型位图图像或类似的内容,则可能需要执行此操作。然后您可以执行
x:=nil
SetLength(x,0)
之类的操作。

动态数组是托管类型。这意味着,当对数组的最后一次引用超出范围时,编译器将处理内存。这意味着在代码中释放数组的代码是毫无意义的

如果需要,可以使用以下任何等效代码行提前解除分配阵列:

SetLength(x, 0);
Finalize(x);
x := nil;

请注意,如果对同一数组有多个引用,则需要对该数组的所有引用执行此操作。

Delphi5上的SetLength for string导致leak@Sergei:那么您的程序中的其他地方可能有错误,或者Delphi 5编译器中有错误(不太可能)。