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

时间:2012-05-18 16:13:50

标签: 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;

2 个答案:

答案 0 :(得分:24)

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

但是,如果您的程序正在关闭之前,您的标识符不会超出范围,那么您可能希望手动释放与其关联的内存。特别是,如果标识符是一个大的位图图像或类似的东西,您可能希望这样做。然后你可以x := nilSetLength(x, 0)或类似的东西。

答案 1 :(得分:10)

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

如果需要,可以使用以下任何等效代码行提前释放数组:

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

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