尝试通过共享指针使用变量时读取访问冲突

Read Access Violation while trying to use variables through shared pointers

这是我的大学课程作业。

我有一个名为 timestep 的 class,它将用作游戏引擎中的典型计时器来计算帧时间等,还有一个 application class.

我正在努力了解共享指针,但我需要使用共享指针从 application class 访问 timestep class。在程序运行 运行 之前它不会抛出错误,此时它将我的 "PRE TIMER" 日志打印到控制台,并在到达 timer->setStart() 后抛出异常,标记行 start = .....setStart 方法中,并表示 **this** was nullptr.

Timestep.h:

#pragma once

#include <chrono>

namespace Engine {
    class Timestep {
    private:
        std::chrono::high_resolution_clock::time_point start;
        std::chrono::high_resolution_clock::time_point end; 
    public:
        Timestep();
        void setStart();
        void setEnd();
        float getTimeSeconds() const;
        float GetTimeMilliSeconds() const;
    };
}

timestep.cpp:

#pragma once

#include "engine_pch.h"
#include "core/timestep.h"

namespace Engine {
    Timestep::Timestep(){}

    void Timestep::setStart() {
        start = std::chrono::high_resolution_clock::now();
    }

    void Timestep::setEnd() {
        end = std::chrono::high_resolution_clock::now();
    }

    float Timestep::getTimeSeconds() const {
        std::chrono::duration<float> time = end - start;
        return time.count();
    }

    float Timestep::GetTimeMilliSeconds() const {
        std::chrono::duration<float, std::milli> time = end - start;
        return time.count();
    }

}

application.cpp:

#include "engine_pch.h"
#include "core/application.h"


namespace Engine {
    Application* Application::s_instance = nullptr;
    std::shared_ptr<Timestep> timer;

    Application::Application()
    {

        if (s_instance == nullptr)
        {
            s_instance = this;
        }
        log::log();
        LOG_INFO("Logger init success");

    }

    Application::~Application()
    {

    }

    void Application::run()
    {
        LOG_INFO("PRE TIMER");
        timer->setStart();
        LOG_INFO("POST TIMER");
        while (s_instance) {
            timer->setEnd();
            float a = timer->getTimeSeconds();
            LOG_INFO("Time since last frame is {0}", a);
            timer->setStart();
        }
    }

}

显然,您在 application.cpp 中的 timer 没有指向 Timestep 的任何实例,导致了 nullptr 错误。简单解释一下,你的共享指针没有初始化。

假设您希望每个应用程序实例都有一个单独的 Timestep 实例,也许您可​​以通过初始化 std::shared_ptr<Timestep> timer;

来解决问题

而不是

std::shared_ptr<Timestep> timer;

尝试

std::shared_ptr<Timestep> timer(new Timestep());