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

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

本文关键字:Object 不能 安全 true IsValid 返回 为什么      更新时间:2023-10-16

我有以下函数:

void AddActor(AActor* Actor)
{
    if (!IsValid(Actor)) { return; }    
    if (Actor->IsA(ACertainActor::StaticClass()))
    { 
        //...
    }
} 

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

根据代码文档IsValid()返回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应该可用。

这不是它的工作原理吗?

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

好吧,从你的例外:

UE4Editor.exe中0x00007FF868B56895(UE4Editor-CoreUObject.dll(引发异常: 0xC0000005:访问冲突读取位置0xFFFFFFFFFFFFFFFF。

in 明确指出此指针不是 nullptr,它具有价值0xFFFFFFFFFFFFFFFF 。所以IsValid按照文档中写的那样工作:

如果对象可用,则返回 true:非 null 且不挂起 kill

您应该初始化指向 nullptr 的指针。