所以我有一个类来处理Lua脚本作为游戏的一部分。以下是添加要在每次迭代中运行的脚本以及同时运行的许多其他脚本的函数。
void create(string script, void *obj, map<string, Tools::lua_function> flist) // void *obj is a (Tools::LuaScript) casted to void*
它存储在地图中如下:
map<string, pair<lua_State*, void*> > lua_states;
create function只是在脚本中加载并注册函数列表,然后将lua状态存储在lua_states[n]->first
上,并指向处理脚本的类的指针(从Tools :: LuaScript类派生){{ 1}}到void *obj
现在我通过在每次迭代时调用lua_states[n]->second
来使用它,然后循环遍历此映射并调用LuaHandler::run()
,因为script->run(i->second.first);
是script
被反对投放到lua脚本类。
void*
为了澄清,class LuaScript {
public:
virtual void run(lua_State*) = 0;
virtual void render() = 0;
virtual bool req_update() = 0;
};
调用与该脚本文件相关的类,该文件使用必需的变量等来更新脚本......,这是此设置的重点。
所以这个工作正常,我已成功加载了三个不同的脚本,但现在,我创建了一个新类,并添加了这样的脚本:
script->run()
因为LuaHandler是一个单例,我可以绑定要绑定的类的构造函数中的脚本。我在上一课中完成了同样的事情,我只是复制了它并更改了类的名称来创建这个新类。
但是,当加载此脚本的时候我得到一个LuaHandler::i().create("script_file", (void*)(this), function_list);
,gdb没有很好地跟踪它,所以我使用了DrMemory并得到了这个输出:
所以在我使用
的run方法中Illegal Instruction
这会带回一些无效指针。我正在呼叫Tools::LuaScript* script = (Tools::LuaScript*)i->second.second;
if(script->req_update()) { //LuaHandler:56
...
}
就像我在每个班级一样,但出于某种原因,它在这种特殊情况下失败了。
我很难道歉,如果这很难理解,解释起来很棘手,如果需要我可以发送2个文件。
Tldr:从LuaScript派生的类(只允许函数run(),render()和req_update()被抽象地调用)使用LuaHandler :: i()。create()将“绑定”到lua_State *但是,当我遍历绑定的脚本,并调用其中任何一种方法时,它都会失败。当它不适用于其他相同的绑定类时。
答案 0 :(得分:0)
所以我总是回答我自己的问题......真的是新手错误,我创建了这样一个类的实例:
A c(mapp, renderer);
什么时候我应该创建一个指针
A *a = new A(app, renderer);
因为我在实例被破坏的函数末尾创建它,因此存储的指针变为无效。