You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
运行时,一次正常Dispose env后,如果重新创建(不退出)一个evn加载代码运行,然后再次Dispose。会报 try to dispose a LuaEnv with C# callback!
而且调用 util.print_func_ref_by_csharp() 总是会打印出所有注册过的的函数,即使已经被释放了。
请看这个示例:https://github.com/virtualhu/xLuaBugSample------------------ 原始邮件 ------------------
发件人: "chexiongsheng"<notifications@github.com>
发送时间: 2019年9月6日(星期五) 下午4:18
收件人: "Tencent/xLua"<xLua@noreply.github.com>;
抄送: "virtualhu"<virtualhu@qq.com>;"Author"<author@noreply.github.com>;
主题: Re: [Tencent/xLua] 多次Dispose问题 (#634)
重新创建(不退出)是什么意思呢?
最好给出可重现代码。
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or mute the thread.
publicclasstest:MonoBehaviour{XLua.LuaEnv_env;publicstaticSystem.ActioneClick;// Use this for initializationvoidStart(){_ReloadLua();}voidfoo(){bar();}voidbar(){if(LuaEntry.Dispose!=null){LuaEntry.Dispose();//_env.DoString(@"print('随便再执行一行lua代码,重新创建env就不会报错')");}}void_ReloadLua(){if(_env!=null){foo();//-----方案1 begin----//LuaEntry.Dispose = null;//LuaEntry.Init = null;//eClick = null;//-----方案1 end----_env.Dispose();_env=null;}_env=newXLua.LuaEnv();_env.DoString(@"require 'main'");if(LuaEntry.Init!=null){LuaEntry.Init();}}// Update is called once per framevoidUpdate(){}privatevoidOnGUI(){if(GUI.Button(newRect(0,0,300,100),"Click")&&eClick!=null){eClick();}if(GUI.Button(newRect(500,0,300,100),"Reload")){_ReloadLua();}}}
Activity
chexiongsheng commentedon Sep 6, 2019
重新创建(不退出)是什么意思呢?
最好给出可重现代码。
virtualhu commentedon Sep 6, 2019
https://github.com/virtualhu/xLuaBugSample
问题示例请看这个。代码在 test.cs及main.lua.txt
演示的是,运行中反复释放env,创建evn并加载代码。在第一次做些操作时是正常的。从第2次开始就会报错。但是,如果在dispose前额外用Dostring执行一行lua代码,这个问题就不存在了。
virtualhu commentedon Sep 8, 2019
chexiongsheng commentedon Sep 9, 2019
你这问题和c#的栈对象gc策略有关。你在当前栈帧使用那对象(LuaEntry.Dispose),所以该对象不一定会被释放;
方案1,在C#那赋值为空
方案2,把那个LuaEntry.Dispose调用放在两层嵌套的函数里调用,下面的代码就是方案2
上面两个方案都不需要调用到xlua的api就能解决,证明和xlua没啥关系。至于为啥DoString后可以,我猜和这里有pinvoke有关。
virtualhu commentedon Sep 9, 2019
好的,非常感谢!
方案一不太方便使用,毕竟注册是在lua里,那释放也在lua会比较好管理。
只能用方案二