如何做lua_pushstring并避免内存不足的setjmp异常

有时,我想在分配一些资源之后在地方使用lua_pushstring,如果发生故障我需要清理.但是,正如文档似乎暗示的那样,lua_push *函数总是会出现内存不足异常.但是,该异常会立即退出我的C范围,并且不允许我清理我可能暂时分配的任何可能必须在发生错误时被释放的内容.

用于说明情况的示例代码:

void* blubb = malloc(20);
...some other things happening here...
lua_pushstring(L, "test"); //how to do this call safely so I can still take care of blubb?
...possibly more things going on here...
free(blubb);

是否有一种方法可以事先检查是否会发生这种异常,然后在我安全清理自己的资源后立即避免推送并执行自己的错误触发?或者我可以以某种方式简单地停用setjmp,然后在执行推送之后检查一些“魔术变量”以查看它是否实际工作或触发错误?

我认为pcall’ing我自己的功能,但即使只是推动堆栈上的功能我想通过pcall安全地调用可能会给我一个内存不足,不是吗?

为了清理问题,我特别要求将它与自定义内存分配器结合使用,以防止Lu​​a分配太多内存,因此假设这不是整个系统内存不足的情况.

最佳答案 除非您在创建Lua状态时使用Lua注册了用户定义的内存处理程序,否则出现内存不足错误意味着整个应用程序内存不足.通常不可能从这种状态恢复.或者至少,在很多情况下都不可行.这可能取决于您的应用程序,但可能不是.

简而言之,如果它出现了,你就会有更大的事情需要关注;)

应该影响您的唯一类型的清理是针对应用程序外部的事情.如果你有一些进程全局内存,你需要释放或设置一些状态.你正在进行进程间通信,你有一些你正在谈论的内存映射文件.或类似的东西.

否则,最好只是杀死你的进程.

您可以将Lua构建为C库.当你这样做时,错误成为实际的异常,您可以捕获或只使用RAII对象来处理.

如果你坚持使用C ……那么,你可以做的并不多.

I am specifically interested in a custom allocator that will out of memory much earlier to avoid Lua eating too much memory.

然后你应该以另一种方式处理它.发出内存不足错误的信号基本上就是说,“我希望Lua立即终止.”

阻止Lua吃掉内存的方法是定期检查Lua状态的内存,如果使用太多则垃圾收集它.如果这没有释放足够的内存,那么你应该手动终止Lua状态,但只有在安全的情况下才能这样做.

点赞