我有一段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将被捕获。将执行a=nil,但不会释放内存。
在出现内存不足异常的情况下,有没有办法释放内存?
我尝试了SetLength(a, 0, 0, 0)和Finalize(a),但两者都不起作用。
发布于 2012-09-30 00:54:48
一般来说,不可能从内存不足错误中恢复。在这一点上,堆很可能已损坏。适当的响应是终止该进程。
在此特定情况下,由System单元中的DynArraySetLength执行分配。这将执行重复分配。只有当DynArraySetLength的最后一个动作是返回值时,上面代码中的a才被实际赋值。如果DynArraySetLength中出现错误,则运行时不会进行清理。这意味着在失败的情况下,分配的任何内存都会泄漏,并且无法恢复。你没有办法引用它来释放它。
你可能会认为DynArraySetLength应该做更多的事情来整理。然而,它的方法是合理的。由于内存不足的情况总是会导致堆损坏,因此尝试清理只会延长痛苦。一旦堆死了,就没有必要尝试释放内存了。
https://stackoverflow.com/questions/12654320
复制相似问题