尝试通过共享指针使用变量时读取访问冲突
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());
这是我的大学课程作业。
我有一个名为 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());