【发布时间】:2014-04-09 23:17:09
【问题描述】:
对于一个学校项目,我正在使用 Lua 向游戏引擎添加一些脚本功能。该引擎的加载速度很慢,因此我不必每次更改我的 Lua 脚本时都重新启动它,而是希望能够重新加载脚本。即使其他脚本作者以不可预知的方式污染了全局状态,我也希望能够以一种安全可靠的方式执行此操作。
在我看来,最简单的方法是简单地销毁我的 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() 是否进行任何内存释放?