我有一段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=nil
和SetLength(a, 0, 0, 0)
,两者都无效。
答案 0 :(得分:8)
通常,无法从内存不足错误中恢复。此时堆很可能已损坏。适当的回应是终止该过程。
在此特定情况下,分配由DynArraySetLength
单元中的System
执行。这会执行重复分配。只有DynArraySetLength
的最后一个行为是上面代码中的返回值a
,才会实际分配。如果DynArraySetLength
中出现错误,则运行时不会整理。这意味着如果发生故障,分配的任何内存都会泄露,无法恢复。您无法参考它以释放它。
您可能认为DynArraySetLength
应该做更多的事情来整理。但是,它的方法是合理的。由于内存不足的情况总会导致堆坏,试图整理只会延长痛苦。一旦堆死了,尝试释放内存是没有意义的。