对于一个学校项目,我使用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