如何使用SetLength在Delphi中发生内存不足异常时释放内存

时间:2012-09-29 16:19:43

标签: delphi memory free multidimensional-array

我有一段Delphi代码

var
  a: array of array of array of integer;
begin
  try
   SetLength(a, 100000, 100000, 10000); // out of memory here
   doStuffs(a); 
  except
   a = nil; // try to free the memory 
  end;
end;

上面的代码尝试分配大量内存,并且out-of-memory将被捕获。 <{1}}将被执行,但内存未被释放。

在出现内存异常的情况下,有没有办法释放内存?

我尝试了a=nilSetLength(a, 0, 0, 0),两者都无效。

1 个答案:

答案 0 :(得分:8)

通常,无法从内存不足错误中恢复。此时堆很可能已损坏。适当的回应是终止该过程。

在此特定情况下,分配由DynArraySetLength单元中的System执行。这会执行重复分配。只有DynArraySetLength的最后一个行为是上面代码中的返回值a,才会实际分配。如果DynArraySetLength中出现错误,则运行时不会整理。这意味着如果发生故障,分配的任何内存都会泄露,无法恢复。您无法参考它以释放它。

您可能认为DynArraySetLength应该做更多的事情来整理。但是,它的方法是合理的。由于内存不足的情况总会导致堆坏,试图整理只会延长痛苦。一旦堆死了,尝试释放内存是没有意义的。