14

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

处理此问题的最佳方法是什么...根据我的发现,它建议如下...

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

2 回答 2

26

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

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

于 2012-05-18T16:15:04.477 回答
15

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

如果需要,您可以使用以下任何等效代码行提前取消分配数组:

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

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

于 2012-05-18T16:19:05.347 回答