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

17

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

那么处理这个问题的最佳方式是什么...根据我的发现,建议采用以下方法...

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

28

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

然而,如果你有一个标识符一直保持有效,比如说直到程序关闭,那么你可能希望手动释放与其关联的内存。特别是,如果标识符是一个大型位图图像或类似的东西,那么你可以执行x := nilSetLength(x, 0)或类似的操作。


Delphi5 中的 SetLength 函数导致了内存泄漏。 - Sergei Krivonos
@Sergei:那么要么你的程序中有其他bug,要么是Delphi 5编译器出现了bug(不太可能)。 - Andreas Rejbrand

17

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接