问题描述
新建了一个继承于UObject
的UClass,假设类名为ClassA
。
新建了一个继承于AActor
的类,假设类名为ATest
。
在ATest
中定义了一个成员变量TArray<ClassA*> MyArray
,并在「构造函数」中创建多个ClassA
实例,逐一添加到MyArray
中。
然后在ATest::Tick()
中遍历MyArray
,调用其中每一个元素的成员函数。
报空指针异常。
查看debug信息,可以看到MyArray
中所有的元素都变成了nullptr
。
1 | UCLASS() |
疑惑
讲道理,我们都可以猜到明明添加进TArray
的是正常的对象(debug可证),但是取出来却是个nullptr,这这个对象必定是被销毁了。
被销毁也就意味着引用计数变成了0。
经查,可得以下结论:
- 声明为
UPROPERTY
的UObject
引用计数会加一 - 被添加到
TMap
,TArray
,TSet
等UE4容器类的UObject
的引用计数会加一 - 执行了
UObject::AddToRoot()
之后引用计数也会加一
那么,为什么已经将TArray
声明为UPROPERTY
,还是会出现引用丢失呢?
解决手法
后来机缘巧合,把TArray
元素的初始化从构造函数移动到了BeginPlay()
就解决问题了。
原理
待研究。