Я разрабатываю программу, которая использует Lua для написания сценариев, и иногда она будет разбиваться. С GDB я думаю, что нашел проблему, но я не знаю, разрешил ли она ее, поскольку segfault будет происходить только эпизодически. Таким образом, старый код был такой:Lua: Может ли это вызвать segfault?
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));
И segfault больше не возникало. Может ли это быть проблемой?
Следует отметить, что при переходе Lua-> C lua гарантирует, что у вас есть новый стек, и на этом переходе C-> lua lua гарантирует, что стек очищен от того, что вы, возможно, оставили на нем, поэтому нет балансирование в этих точках требуется (однако, по-прежнему может быть хорошей практикой). Однако, пока вы находитесь на C, требуется управление стеком (и балансировка стека функций). –