我正在開發一個使用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