首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SetLength在Delphi中如何在发生内存不足异常时释放内存

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

Stack Overflow用户
提问于 2012-09-30 00:19:43
回答 1查看 3.7K关注 0票数 6

我有一段Delphi代码

代码语言:javascript
复制
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),但两者都不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-30 00:54:48

一般来说,不可能从内存不足错误中恢复。在这一点上,堆很可能已损坏。适当的响应是终止该进程。

在此特定情况下,由System单元中的DynArraySetLength执行分配。这将执行重复分配。只有当DynArraySetLength的最后一个动作是返回值时,上面代码中的a才被实际赋值。如果DynArraySetLength中出现错误,则运行时不会进行清理。这意味着在失败的情况下,分配的任何内存都会泄漏,并且无法恢复。你没有办法引用它来释放它。

你可能会认为DynArraySetLength应该做更多的事情来整理。然而,它的方法是合理的。由于内存不足的情况总是会导致堆损坏,因此尝试清理只会延长痛苦。一旦堆死了,就没有必要尝试释放内存了。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12654320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档