从内存不足故障中恢复

Recovering from out of memory failure

我正在使用内存池创建很多对象。我所有的对象都派生自一个 Base class,它的 new/delete 过度使用我的内存池,基本上它们调用 pool.allocate(size).

我想做的是当池 运行 内存不足时(系统中仍有可用内存可以运行)我想将所有内容设置回开头。我正在考虑在分配失败时在 main 和 goto 标签之后设置标签,重置池并重新开始。

所有非堆栈分配都由内存池处理。这是实现这一目标的明智方法吗?后续会不会有什么问题?

编辑:

这是在嵌入式平台上 运行 宁,所以没有 OS 没有例外。我正在尝试实现受控重启而不是内存不足导致的崩溃。池足够大以进行计算,我正在尝试控制崩溃以防某些功能出错。

运行运行 没有要保存的状态。我正在尝试通过软件实现按下重置按钮的过程。所以我可以重置回主要通知应用程序关于重启的开始。

首先想到的是抛出异常。这实际上是 operator new 的默认实现的行为方式:它抛出 std::bad_alloc.

goto 仅在整个程序仅限于单个功能时才有效。我看到 main 的可能实现如下:

int main(int argc, const char* argv[]) {
    while(true) {
        try {
            do_things(argc, argv);
        } catch(const MyBadAlloc& ex) {
            do_cleanup();
            continue;
        }
    }
 }

我曾经用 setjmp()/longjmp() 做过类似的事情。它并不完美或没有问题,但在大多数情况下它是有效的。喜欢:

jmp_buf g_env;

int main()
{
    int val = setjmp(g_env);
    if (val) {
        // restarting, do what you need to do
    }
    // initialize your program and go to work
}

/// where you want to restart:
    longjmp(g_env, 101); /// 101 or some other "error" code

这是一个 goto 真的,所以,记得自己做任何清理工作。