【问题标题】:Why isn't Object safe to use after IsValid(Object) returned true?为什么在 IsValid(Object) 返回 true 后 Object 不能安全使用?
【发布时间】:2017-06-13 18:40: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 应该可以使用了。

这不是它的工作原理吗?

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

【问题讨论】:

  • 在致电IsValid 之前,文档没有明确说明要求。但据推测,您的代码不符合它们。我推测指针必须是 nullptr,指向有效的 AActor 或指向无效的 AActor(等待终止)。

标签: c++ access-violation unreal-engine4


【解决方案1】:

好吧,你的例外:

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

in 明确指出这个指针不是 nullptr,它的值是0xFFFFFFFFFFFFFFFF。所以IsValid 按照文档中的说明工作:

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

您应该将指针初始化为nullptr

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多