【发布时间】:2020-11-14 06:16:06
【问题描述】:
我在C++ 中使用Lua C API,并将其包装到一个类中,如下所示:
class LuaScripting {
public:
lua_State *lua;
LuaScripting();
~LuaScripting();
bool execute_script(const std::string &script);
};
LuaScripting::LuaScripting() {
lua = luaL_newstate(); /* Opens Lua */
luaL_openlibs(lua); /* Opens the standard libraries */
/* Register our custom function(s) */
lua_register(lua, "write8", lua_write8);
lua_register(lua, "write16", lua_write16);
lua_register(lua, "write32", lua_write32);
lua_register(lua, "read8", lua_read8);
lua_register(lua, "read16", lua_read16);
lua_register(lua, "read32", lua_read32);
lua_register(lua, "math_sin", math_sin);
}
LuaScripting::~LuaScripting() {
lua_close(lua); /* Clean up lua */
}
我正在测试如下:
int main() {
// Disable buffering
setbuf(stdout, nullptr);
LuaScripting lua_scripting;
testWritingInt8(lua_scripting);
testWritingInt16(lua_scripting);
testWritingInt32(lua_scripting);
testReadingInt32(lua_scripting);
test_math_sin(lua_scripting);
return EXIT_SUCCESS;
}
我遇到的问题:
- 在第一个
testWritingInt8()之后调用类析构函数,即使类实例尚未超出范围,也会运行lua_close(lua)。我没有使用任何线程。为什么会这样? - 调用
lua_close(lua)时程序崩溃,为什么? - 注释掉
lua_close(lua)后,写入测试用例成功运行,但readXX()或math_sin()返回一个空堆栈,尽管将一个值压入堆栈。为什么?
实施:
static int math_sin(lua_State *lua) {
const auto value = luaL_checknumber(lua, 1);
const auto sine_result = sin(value);
lua_pushnumber(lua, sine_result);
return 1;
}
测试用例:
void test_math_sin(LuaScripting &lua_scripting) {
std::stringstream lua_script_builder;
const auto target_value = 90.f;
lua_script_builder << "math_sin(" << target_value << ")";
const auto script_result = lua_scripting.execute_script(lua_script_builder.str());
assert(script_result == LUA_OK);
// TODO Not working
const auto read_value = (int32_t) lua_tonumber(*lua_scripting.lua, -1);
assert(target_value == read_value);
}
我总是使用同一个lua_State *,而且我只调用一次luaL_newstate()。
作为尝试的修复,我尝试将 lua 状态声明为非指针:
lua_State lua; // error: aggregate ‘lua_State lua’ has incomplete type and cannot be defined
但是这样做不会编译。
通过lua_State **lua 添加另一个间接级别修复了lua_close() 的崩溃问题,但没有解决任何其他问题。
【问题讨论】:
标签: c++ linux class lua destructor