c++ - 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 代码有效,而另一个字节则为灰尘!!我一点头绪都没有!!是的,我想这不会是显而易见的。我不需要帮助。我可以把它剪下来,然后自己建立起来,如果我愿意的话,我可以弄清楚。不过,这很奇怪。不过,我感谢您的努力和提议!谢谢!
解决方案
虚幻引擎为 UObject 实现了自己的垃圾收集。
您必须标记您的 UObject 派生指针,UPROPERTY
以确保 Unreal Reflection 系统可以引用计数指向您的 UObject 的指针,以便垃圾收集系统在运行时不会从您的下方将其销毁。
UPROPERTY()
UHUDWidget* HUDWidget;
这应确保您的 HUD 在您仍在使用它时仍保持活动状态。一旦对它的所有引用都消失了,GC 将为您处理该对象并在必要时将其销毁。如果您不按照前面的说明进行此标记,它将在没有警告的情况下消失。
推荐阅读
- javascript - 打字稿:按值检查对象是否存在于数组中
- java - HashMap 在内部检查两个键是否相等,使用的是哪种算法?
- javascript - 我需要在角度翻译中翻译一个动态变量
- xml - XML - XSLT 按计数分组元素
- node.js - TypeError: Request path contains unescaped characters at googleapis
- javascript - How can I get PurifyCSSPlugin to remove my unused css in Angular6?
- android - 如何通过公交获得覆盖距离
- sql - Oracle Regexp_substr 字符串
- php - ReactPHP get_class() 期望参数 1 是对象,给定字符串
- html - Angular:从 HTML 发送元素