我正在使用内存池来创建大量对象。我的所有对象都派生自一个Base类,它的new / delete over ridden使用我的内存池,基本上它们调用pool.allocate(size)。
我想要做的是当池内存不足时(系统中仍有可用内存才能运行)我想把所有内容都设置回到开头。我想在分配失败时在main和goto标签后面设置一个标签,重置池并重新开始。
所有非堆栈分配都由内存池处理。这是实现这一目标的明智方法吗?是否会出现任何问题?
编辑:
这是在嵌入式平台上运行,所以没有操作系统没有例外。我试图实现受控重启,而不是从内存不足崩溃。池足够大以进行计算,我试图控制崩溃,以防某些功能出错。
没有状态可以从运行中保存。我试图用软件来达到重置按钮的过程。所以我可以重新启动主要通知应用程序重启。
答案 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;
}
}
}