Lua:如何正确清理lua_pcall返回的错误

时间:2013-07-08 15:07:46

标签: crash lua stack-overflow

我现在已经和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是一个字符串,或者可能有一个标准的'清理堆栈'函数我可以调用?

由于

1 个答案:

答案 0 :(得分:2)

您修改的代码很好,除了您需要弹出1而不是-1。