有时,在分配了一些资源后,我想在某些地方使用 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 安全调用的函数推入堆栈也可能让我内存不足,不是吗?
为了澄清问题,我特别要求将其与自定义内存分配器结合使用,以防止 Lua 分配过多内存,因此假设这不是整个系统内存不足的情况。