EOutOfMemory异常是否可以恢复?

时间:2013-02-20 08:32:43

标签: delphi exception out-of-memory

在捕获EOutOfMemory异常之后继续执行是否有意义,或者现在堆或堆栈是否以高概率损坏?

我不是指由于写入通配地址等错误导致的先前内存损坏导致EOutOfMemory的情况,我的意思是正确的代码调用GetMem并捕获EOutOfMemory

2 个答案:

答案 0 :(得分:6)

在我看来,试图从EOutOfMemory继续是没有意义的。根据我的经验,堆可能会被破坏并且可能出现未来错误的可能性非常高。通常,最安全的做法是终止该过程。

答案 1 :(得分:1)

总的来说,我同意试图恢复是没有意义的。但它在特定情况下可能有用。例如,分配大量依赖于用户选择的内存,如果失败,您可以干净地退出并让它们使用不同的设置重试。我这样做是为了将点云转换为3D网格,其中包括一些事先不知道内存要求的步骤。只需仔细编码您想要恢复的步骤,即可立即采用干净的退出路径。例如,我的一些数据结构是位图或缓冲区,每条线分别分配,以最大限度地减少碎片内存的问题。构造函数已尝试...除了处理和抛出EOutOfMemory异常,并且析构函数释放已经分配的任何行。我不能保证它会一直有效,但它已经足够值得做了。