从内存不足故障中恢复
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
真的,所以,记得自己做任何清理工作。
我正在使用内存池创建很多对象。我所有的对象都派生自一个 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
真的,所以,记得自己做任何清理工作。