-
Notifications
You must be signed in to change notification settings - Fork 690
Description
unlua的大大们好,这边发现了问题,unlua版本:2.1.4,UE4版本:4.27.1
运行时动态创建两个相同类的不同实例,他们身上都有一个MulticastDelegate,并且都由蓝图逻辑绑定到第三类同实例的相同函数上,再由lua对两个多播委托进行Broadcast。
此时经由FDelegateHelper::Broadcast()流程,会在MulticastDelegate2Signatures中缓存两个key不同但value相同的FFunctionDesc指针,因为他们委托的地址不同,但绑定的函数地址相同。

随后关闭虚拟机时,在FDelegateHelper::Cleanup()中,清理MulticastDelegate2Signatures时进入
GReflectionRegistry.UnRegisterFunction(),内部对value做有效性检查。由于第一个Function指针已经移除了,因此第二次进来时会崩溃在InFunction->HasAnyFlags(RF_BeginDestroyed)。

这里应该把InFunction->IsValidLowLevel()的判断挪到前面,就可以避免这种崩溃问题,而且也应该挪到前面,否则这个处理没有什么意义。

另外想请问一下MulticastDelegate2Signatur中的key是以委托的指针缓存的,好像没有特别提供清理MulticastDelegate2Signatur的接口,FDelegateHelper::Clear函数中也没有清理,在不关闭虚拟机的情况下,这个Map会反复增长(包括局内局外的跳转,因为我们局内带多播的某类对象支持复用),应该是考虑缓存提升效率?这个反复增长该如何处理呢?如果委托的实例销毁后,缓存的数据应该也无效了
