對於一個學校項目,我使用Lua爲遊戲引擎添加一些腳本功能。引擎加載速度很慢,所以不必每次更改我的一個Lua腳本時重新啓動它,我希望能夠重新加載腳本。我希望能夠以一種安全可靠的方式做到這一點,即使其他劇本作者以不可預知的方式污染了全球國家。如何破壞並重新創建一個lua_State
在我看來,最簡單的方法是簡單地銷燬我的C++代碼中的lua_State
,然後創建一個新的,重新綁定我的函數並重新加載所有必需的腳本。不過,我在正常工作時遇到了一些麻煩。我有一個類,它作爲一個接口到Lua虛擬機,它具有以下構造函數和析構函數:
LuaInterface::LuaInterface()
{
luaVM = lua_open();
luaL_openlibs(luaVM);
// Create the ortsgfx table.
lua_newtable(luaVM);
lua_setglobal(luaVM, TABLE_NAME);
}
LuaInterface::~LuaInterface()
{
// Close the Lua virtual machine
lua_close(luaVM);
}
注意lua_close(luaVM)被調用時,對象的析構函數執行。我試圖從遊戲引擎用下面的代碼重置的Lua:
lua.~LuaInterface();
lua = LuaInterface();
initLua();
(Lua是一個LuaInterface對象,當然。)這導致分段故障initLua()
當我嘗試初始化我的表之一。 但是,如果我刪除析構函數中的lua_close(luaVM)
調用,那麼一切工作正常。
我在做什麼錯?另外,有沒有更好的方式去重新加載我的Lua腳本?
lua_close()是否執行任何內存解除分配? – ScarletAmaranth