Lua: How to properly clean up errors returned by lua_pcall
我在Lua上遇到了崩溃问题已有一段时间了,我终于发现了我认为是问题所在。我允许脚本省略为方便起见尝试调用的函数。我希望我的应用程序尝试调用TestFun(作为示例),如果存在,则执行它,否则,正常地和静默地失败。
我遇到的问题是,我只是调用lua_pcall(L,0,0,0)而忽略了返回值,因为这对我而言并不重要。我发现的是,当Lua生成错误"尝试调用nil"时,它将其放置在其堆栈上,而我没有弹出该错误。下面的代码由于stacksize变得太大而在运行后不久出现崩溃:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | int _tmain(int argc, _TCHAR* argv[]) { std::string script =""; lua_State* L = luaL_newstate(); luaL_openlibs(L); luaL_loadstring(L, script.c_str()); lua_pcall(L, 0, LUA_MULTRET, 0); while (true) { lua_getglobal(L,"TestFunc"); lua_pcall(L, 0, 0, 0); } return 0; } |
我只是将while循环内的代码修改为:
1 2 3 4 5 6 | while (true) { lua_getglobal(L,"TestFunc"); if (lua_pcall(L, 0, 0, 0)) lua_pop(L, -1); } |
这解决了我的崩溃。我的问题是,这是否在lua_pcall()错误结果的所有情况下均有效,或者是否通过不专门检查是否应该弹出-1(或其他错误)来设置自己的另一个错误/崩溃。也许我只在-1是一个字符串时才弹出,或者也许有一个我可以调用的标准"清理堆栈"功能?
谢谢
修改后的代码很好,只是需要弹出1,而不是-1。