Skip to content

不同实例的MulticastDelegate绑定相同实例函数并由lua广播触发,关闭虚拟机时崩溃 #400

@yellow7ming

Description

@yellow7ming

unlua的大大们好,这边发现了问题,unlua版本:2.1.4,UE4版本:4.27.1

运行时动态创建两个相同类的不同实例,他们身上都有一个MulticastDelegate,并且都由蓝图逻辑绑定到第三类同实例的相同函数上,再由lua对两个多播委托进行Broadcast。
此时经由FDelegateHelper::Broadcast()流程,会在MulticastDelegate2Signatures中缓存两个key不同但value相同的FFunctionDesc指针,因为他们委托的地址不同,但绑定的函数地址相同。
unlua多播问题3

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

unlua多播问题5

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

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions