我最近在看一些使用SetLength为一个字节数组分配内存的代码,但我没有看到任何释放该内存空间的逻辑。我已经读过,对于一个字节数组,你应该将值设置为nil或使用Finalize?
处理这个问题的最佳方法是......基于我发现的内容,建议如下......
var
x: array of byte;
begin
SetLength(x, 30);
// Do something here
:
// Release the array
x := nil;
Finalize(x);
end;
答案 0 :(得分:24)
通常,您根本不需要释放内存,因为当标识符(在本例中为x
)超出范围时,这会自动完成。因此,代码中的最后两行完全没有意义。
但是,如果您的程序正在关闭之前,您的标识符不会超出范围,那么您可能希望手动释放与其关联的内存。特别是,如果标识符是一个大的位图图像或类似的东西,您可能希望这样做。然后你可以x := nil
,SetLength(x, 0)
或类似的东西。
答案 1 :(得分:10)
动态数组是托管类型。这意味着当最后一次引用数组超出范围时,编译器将处置内存。这意味着在代码中释放数组的代码是毫无意义的。
如果需要,可以使用以下任何等效代码行提前释放数组:
SetLength(x, 0);
Finalize(x);
x := nil;
请注意,如果您对同一个数组有多个引用,则需要对该数组的所有引用执行此操作。