EOutOfMemory异常是否可恢复



在捕获EOutOfMemory异常后继续执行,或者现在堆或堆栈很可能已损坏,这有意义吗?

我指的不是EOutOfMemory的情况,它是由以前的内存损坏引起的,比如写入到一个野生地址,我指的是调用GetMem并捕获EOutOfMemory的正确代码。

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

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

最新更新