首页 > 解决方案 > UE4 C++ 对类变量的访问冲突,无法在观察点读取内存

问题描述

我已经为这个问题苦苦挣扎了好几个小时,我已经看过但找不到答案,如果它在其他地方得到了解决,那么很抱歉。我找不到匹配的答案。我一个人,需要帮助。我在 BeginPlay 的类中分配了一个指针。我在每个刻度上都引用它,这很好。然后,当我调用另一个事件/函数(UpdateCompassPointer)时,它会在 IF 测试中爆炸以查看它是否为 null 或不存在读取访问冲突!观察点说<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 代码有效,而另一个字节则为灰尘!!我一点头绪都没有!!是的,我想这不会是显而易见的。我不需要帮助。我可以把它剪下来,然后自己建立起来,如果我愿意的话,我可以弄清楚。不过,这很奇怪。不过,我感谢您的努力和提议!谢谢!

标签: c++unreal-engine4access-violation

解决方案


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

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

UPROPERTY()
UHUDWidget* HUDWidget;

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


推荐阅读