关于崩溃:Lua:如何正确清理lua_pcall返回的错误

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。