我正在开发一个使用Lua进行脚本编写的程序,有时会崩溃。有了GDB,我认为我发现了这个问题,但我不知道它是否解决了问题,因为段错误只会偶尔发生。因此,旧的代码是这样的:Lua:这是否会导致段错误
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-> C过渡期间,lua确保你有一个新的堆栈,并且在那个C-> lua过渡lua确保堆栈被清理掉了,在这些方面的平衡是必需的(尽管如此,这仍然是一个很好的做法)。但是,只要你留在C中,就需要栈管理(和功能栈平衡)。 – 2014-09-03 14:40:56