分配浮动时的访问冲突读取位置(0x0000000000000170)

时间:2018-12-18 05:14:54

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

我在访问违规读取位置时崩溃了。我正在虚幻引擎中进行此操作,但是它很简单,我觉得这个问题应该在C ++中普遍适用,尽管我对此并不陌生。

尝试在OpenDoor.cpp的OpenDoor()中分配LastDoorOpenTime时,我崩溃了(如下)。我可以在UOpenDoor :: BeginPlay()程序开始时成功分配给它,但是在OpenDoor()中尝试相同的操作会使应用程序崩溃,并显示“访问冲突读取位置”。

OpenDoor.h:

#pragma once

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "GameFramework/Actor.h"
#include "Engine/TriggerVolume.h"
#include "Engine/World.h"
#include "OpenDoor.generated.h"


UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class ESCAPEROOM_API UOpenDoor : public UActorComponent
{
    GENERATED_BODY()

public: 
    // Sets default values for this component's properties
    UOpenDoor();

protected:
    // Called when the game starts
    virtual void BeginPlay() override;

    void OpenDoor();

    void CloseDoor();

public: 
    // Called every frame
    virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;

private:
    UPROPERTY(VisibleAnywhere)
        float OpenAngle = -60.f;

    UPROPERTY(EditAnywhere)
        ATriggerVolume* PressurePlate;

    UPROPERTY(EditAnywhere)
        float DoorCloseDelay = 1.f;

    float LastDoorOpenTime;

    AActor* ActorThatOpens;

    AActor* Owner;

    bool IsDoorOpen;

    UWorld* ThisWorld;
};

OpenDoor.cpp:

#include "OpenDoor.h"

// Sets default values for this component's properties
UOpenDoor::UOpenDoor()
{
    // Set this component to be initialized when the game starts, and to be ticked every frame.  You can turn these features
    // off to improve performance if you don't need them.
    PrimaryComponentTick.bCanEverTick = true;

    // ...
}


// Called when the game starts
void UOpenDoor::BeginPlay()
{
    Super::BeginPlay();
    ThisWorld = GetWorld();
    ActorThatOpens = ThisWorld->GetFirstPlayerController()->GetPawn();
    AActor* Owner = GetOwner();
    IsDoorOpen = false;
}

void UOpenDoor::OpenDoor()
{
    Owner->SetActorRotation(FRotator(0.f, OpenAngle, 0.f));
    int cow = 1 + 1;
    LastDoorOpenTime = 0.f; //ACCESS VIOLATION HERE
    IsDoorOpen = true;
}

void UOpenDoor::CloseDoor()
{
    Owner->SetActorRotation(FRotator(0.f, 0.f, 0.f));
    IsDoorOpen = false;
}


// Called every frame
void UOpenDoor::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
    Super::TickComponent(DeltaTime, TickType, ThisTickFunction);

    if (PressurePlate->IsOverlappingActor(ActorThatOpens)) {
        OpenDoor();
    }

    if (IsDoorOpen) {
        if (ThisWorld->GetTimeSeconds() >= LastDoorOpenTime + DoorCloseDelay) {
            CloseDoor();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

更改:“ AActor *所有者= GetOwner();”改为“所有者= GetOwner();”修复它。