6

我有一段德尔福代码

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会被捕获。将a=nil被执行,但内存没有被释放。

有没有办法在内存不足异常的情况下释放内存?

我试过SetLength(a, 0, 0, 0)and Finalize(a),两者都不起作用。

4

1 回答 1

8

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

在这种特定情况下,分配是DynArraySetLengthSystem单元中执行的。这执行重复分配。只有最后一个动作是实际分配DynArraySetLength的返回值,在上面的代码中。a如果发生错误,DynArraySetLength则运行时不会进行整理。这意味着在失败的情况下,任何分配的内存都会泄漏并且无法恢复。您无法引用它来释放它。

你可能认为DynArraySetLength应该做更多的整理工作。但是,它的做法是有道理的。由于内存不足的情况总是会导致堆损坏,因此尝试整理只会延长痛苦。一旦堆死了,尝试释放内存就没有意义了。

于 2012-09-29T16:54:47.650 回答