【问题标题】:Lua: How to properly clean up errors returned by lua_pcallLua:如何正确清理 lua_pcall 返回的错误
【发布时间】:2013-07-05 23:41:33
【问题描述】:

我在 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 是一个字符串时才弹出,或者我可以调用一个标准的“清理堆栈”函数?

谢谢

【问题讨论】:

  • 这取决于您的错误处理函数是否将任何项目添加到堆栈中。您总是可以(在调试版本中)在lua_pcall 之前和之后使用lua_gettop 来检查堆栈大小是否正常。

标签: crash lua stack-overflow


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多