从内存不足中恢复

时间:2016-01-16 23:24:07

标签: c++ embedded heap-memory

我正在使用内存池来创建大量对象。我的所有对象都派生自一个Base类,它的new / delete over ridden使用我的内存池,基本上它们调用pool.allocate(size)。

我想要做的是当池内存不足时(系统中仍有可用内存才能运行)我想把所有内容都设置回到开头。我想在分配失败时在main和goto标签后面设置一个标签,重置池并重新开始。

所有非堆栈分配都由内存池处理。这是实现这一目标的明智方法吗?是否会出现任何问题?

编辑:

这是在嵌入式平台上运行,所以没有操作系统没有例外。我试图实现受控重启,而不是从内存不足崩溃。池足够大以进行计算,我试图控制崩溃,以防某些功能出错。

没有状态可以从运行中保存。我试图用软件来达到重置按钮的过程。所以我可以重新启动主要通知应用程序重启。

2 个答案:

答案 0 :(得分:1)

我曾经使用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,所以,请记住自己做任何清理工作。

答案 1 :(得分:0)

首先想到的是抛出异常。这实际上是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;
        }
    }
 }