gpt4 book ai didi

c++ - Lua:这会导致段错误吗

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:03 27 4
gpt4 key购买 nike

我正在开发一个使用 Lua 编写脚本的程序,有时它会崩溃。使用 GDB 我想我发现了问题,但我不知道它是否解决了它,因为段错误只会偶尔发生。所以,旧代码是这样的:

void Call(std::string func){
lua_getglobal(L, func.c_str()); //This is the line GDB mentioned in a backtrace
if( lua_isfunction(L,lua_gettop(L)) ) {
int err = lua_pcall(L, 0, 0,0 );
if(err != 0){
std::cout << "Lua error: " << luaL_checkstring(L, -1) << std::endl;
}
}
}

问题是,这个函数每秒会被调用几次,但它需要调用的函数并不总是被定义,所以我认为堆栈会溢出。我添加了以下行:

lua_pop(L,lua_gettop(L));

并且段错误不再发生。这可能是问题所在吗?

最佳答案

使用lua_gettop(L)作为lua_pop的参数将清除整个Lua API堆栈(相当于lua_settop(0) ),这可能不是您想要的。但实际上你的问题是 lua_getglobal 总是推送一些东西;如果不存在具有给定名称的全局变量,它将压入 nil,就像等效的 Lua 表达式一样。但是,lua_pcall 弹出函数和所有参数(如果有的话;在您的情况下您指定了零),因此如果函数存在,您不会遇到问题。您应该做的是将 lua_pop(L, 1) 添加到外部 ifelse 子句中。这样,您的函数将始终平衡(即让堆栈保持原样)。

你可以在 Lua manual 中看到这些东西:对于每个函数,它在描述中都有详细说明,并在函数原型(prototype)旁边的括号中以灰色表示。例如,lua_getglobal有 [-0, +1, e] 意味着它不会弹出任何元素并且(总是)压入一个元素(并且 e 意味着它可能会导致错误)。

关于c++ - Lua:这会导致段错误吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25646620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com