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

Tim*_*ski 12 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;
Run Code Online (Sandbox Code Playgroud)

And*_*and 24

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

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


Dav*_*nan 11

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

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

SetLength(x, 0);
Finalize(x);
x := nil;
Run Code Online (Sandbox Code Playgroud)

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