首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尝试通过共享指针使用变量时发生读访问冲突

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

Stack Overflow用户
提问于 2020-01-07 10:18:22
回答 1查看 196关注 0票数 2

这是为我的大学课程准备的。

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

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

Timestp.h:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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();
        }
    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-07 10:27:46

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

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

而不是

代码语言:javascript
复制
std::shared_ptr<Timestep> timer;

试一试

代码语言:javascript
复制
std::shared_ptr<Timestep> timer(new Timestep());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59621371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档