为什么在 IsValid(Object) 返回 true 后 Object 不能安全使用?

Why isn't Object safe to use after IsValid(Object) returned true?

我有以下功能:

void AddActor(AActor* Actor)
{
    if (!IsValid(Actor)) { return; }    

    if (Actor->IsA(ACertainActor::StaticClass()))
    { 
        //...
    }
} 

它被传递了一些有效的和一些无效的 Actor-指针(Actors 正在等待销毁或已经销毁)。

并且根据代码文档 IsValid() returns true 如果对象可用:

/**
* Test validity of object
*
* @param    Test            The object to test
* @return   Return true if the object is usable: non-null and not pending kill
*/

但它在 if (Actor->IsA(ACertainActor::StaticClass())) 处崩溃并引发访问冲突:

Exception thrown at 0x00007FF868B56895 (UE4Editor-CoreUObject.dll) in UE4Editor.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

我希望 IsValid(Object) 检查 Object 是否为 nullptr,引擎知道 Object,如果它确实检查它是否正在等待销毁。 所以在 IsValid(Object) 返回 true 后, Object 应该可以使用。

不是这样吗?

是否有任何其他方法来检查指针是否指向可以使用的有效对象?

嗯,从你的例外:

Exception thrown at 0x00007FF868B56895 (UE4Editor-CoreUObject.dll) in UE4Editor.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

in 明确指出这个指针不是 nullptr,它的值是 0xFFFFFFFFFFFFFFFF。所以 IsValid 像文档中写的那样工作:

Return true if the object is usable: non-null and not pending kill

您应该将指针初始化为 nullptr