我现在已经和Lua发生了一段时间的碰撞问题,我终于发现了我认为的问题。我允许脚本省略为方便起见而试图调用的函数。我希望我的应用程序尝试调用TestFun(作为示例),如果它存在则执行它,否则优雅而无声地失败。
我遇到的问题是我只是调用了lua_pcall(L,0,0,0)并忽略了返回值,因为它对我来说无关紧要。我发现的是,当Lua生成错误“尝试调用nil”时,它会将其置于堆栈中,而我并没有将其弹出。由于堆栈大小过大,下面的代码在运行后不久就会出现崩溃:
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循环中的代码修改为:
while (true)
{
lua_getglobal(L, "TestFunc");
if (lua_pcall(L, 0, 0, 0))
lua_pop(L, -1);
}
这解决了我的崩溃。我的问题是这是否在lua_pcall()错误结果的所有情况下都有效,或者我是否因为没有专门检查我是否应该弹出-1(或可能是其他人?)而为另一个错误/崩溃做好准备。也许我只应该弹出,如果-1是一个字符串,或者可能有一个标准的'清理堆栈'函数我可以调用?
由于
答案 0 :(得分:2)
您修改的代码很好,除了您需要弹出1而不是-1。