微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UE4 C++ 类变量上的访问冲突并且无法读取观察点上的内存

如何解决UE4 C++ 类变量上的访问冲突并且无法读取观察点上的内存

我已经为这个问题苦苦挣扎了好几个小时,我已经查找了但找不到答案,如果它已在其他地方得到解决,我很抱歉。我找不到匹配的答案。我一个人,需要帮助。我在 BeginPlay 的班级中分配了一个指针。我在每个刻度上都引用它,这很好。然后,当我调用一个事件/函数 (UpdateCompasspointer) 时,它会在 IF 测试中爆炸,以查看它是否为空且是否存在读取访问冲突!观察点显示 <Unable to read memory>。我所能想到的就是我已经走遍了我的班级,但我没有看到。这是我的定义,然后是代码。变量是 HUDWidget。不过,它就像蜱虫上的青蛙毛一样细!!!!谢谢你的帮助! 更新:我在 cpp 模块的顶部放置了另一个变量来保存相同的指针,并将其用于该函数,并且它工作正常。 Tick 函数继续运行没有问题,但如果我使用它,另一个函数会在对该变量的任何引用上爆炸。太棒了!!

private:
    /** Crosshair asset pointer */
    class UTexture2D* CrosshairTex;
    UHUDWidget* HUDWidget;

void  ATheLostmine2HUD::BeginPlay()
{
    Super::BeginPlay();

    if (HUDWidgetClass)
    {
        HUDWidget = CreateWidget<UHUDWidget>(GetWorld(),HUDWidgetClass);

        /** Make sure widget was created */
        if (HUDWidget)
        {
            /** Add it to the viewport */
            HUDWidget->AddToViewport();
        }
    }
}

void ATheLostmine2HUD::Tick(float DeltaSeconds)
{
    Super::Tick(DeltaSeconds);
    if (HUDWidget)
    {
        if (GEngine)
            GEngine->AddOnScreenDebugMessage(-1,15.0f,FColor::Yellow,FString::Printf(TEXT("Have HUDWidget")));

    }
}

void ATheLostmine2HUD::UpdateCompasspointer(float Yaw,float degrees,float Direction,float Quad)
{
    if (HUDWidget)
    {
        HUDWidget->UpdateCompasspointer(Yaw,degrees,Direction,Quad);
    }
    else
        UE_LOG(LogTemp,Warning,TEXT("HUDWidget is not instantiated"));
}

更多信息和问题。谢谢大家的好评论!所以我知道我正确设置了 HUDWidget 因为如果我把它放在我的代码中它可以正常工作。因此,不知何故,它正在失去标头中的值,并且调试器停止在 If 而不是导致它的语句(如 Ruzihm 建议的那样)。我会按照建议放入 UPROPERTY,然后看看它会做什么。为什么会变得陈旧?我有一个具有完全相同代码的游戏(几乎)并且它没有问题......我会在 UPROPERTY 更新后报告,但我已经习惯了它在我的代码顶部...... 越来越好奇…… UPROPERTY 没有任何帮助。因此,在 Tick 代码中,我使用 HUDWidget 指针插入了一个调用,因此它会崩溃而不是其他函数。它仍然在做同样的事情。 Tick 代码有效,另一个字节是灰尘!!我一点头绪都没有!!是的,我认为这不会是显而易见的事情。我不需要帮助。我可以把它剪下来,然后自己重​​新组装起来,如果我喜欢的话,我可以弄清楚。不过,这很奇怪。不过,我感谢您的努力和提议!谢谢!

解决方法

虚幻引擎为 UObject 实现了自己的垃圾收集。

您必须使用 UPROPERTY 标记您的 UObject 派生指针,以确保虚幻反射系统可以引用计数指向您的 UObject 的指针,以便垃圾收集系统在运行时不会从您的下方将其销毁。>

UPROPERTY()
UHUDWidget* HUDWidget;

这应该可以确保您的 HUD 在您仍在使用时保持活动状态。一旦对它的所有引用都消失了,GC 就会为您处理对象并在必要时销毁它。如果您不按照前面的说明执行此标记,它将在没有警告的情况下消失。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。