测试方法 :
准备两个蓝图 BP_Test,BP_Test1在 BP_Test 里面创建一个名为 TestFunc 的 Function ,该Test方法有个Input参数类型是BP_Test1的类型创建一个测试关卡LV_Test,在LV_Test关卡的蓝图中创建一个变量类型为 BP_Test的类型非PIE,需要打包(WindowsClient),直接LV_Test作为第一个关卡结论:
BP_Test1不会被BP_Test持有而被GC掉分析原因:
BP_Test的UClass中有个Children变量存的方法链表TestFunc中有个ChildProperties变量里面有个类型是FObjectPropertyBase,里面有个PropertyClass变量存的就是野指针了,分析了下,BP_Test1应该是要被 UFunction(TestFunc) 变量 UStruct::ScriptAndPropertyObjectReferences 持有引用计数(这个在提交 commit:b56dcaad716fb6a21f8e2ba8cf897094f56a1618 中变量被设置成了UPROPERTY(SkipSerialization)),但是我跟了下代码发现FStructScriptLoader::LoadStructWithScript中最后清理了ScriptAndPropertyObjectReferences,
尝试解决:
我把下面这段代码注释掉,BP_Tes1 就不会被GC了,但是这应该不是解决方案
if (!GUObjectArray.IsDisregardForGC(DestScriptContainer))
{
DestScriptContainer->ScriptAndPropertyObjectReferences.Empty();
DestScriptContainer->CollectBytecodeReferencedObjects(MutableView(DestScriptContainer->ScriptAndPropertyObjectReferences));
}