我的某个班级遇到了问题。我有这两个类,GameApp和Simulation:
GameApp.h
#pragma once
#include "Simulation.h"
class Simulation;
class GameApp {
static GameApp *instance;
public:
~GameApp(void);
static GameApp *initializeContext(const char *gameTitle, const int windowWidth, const int windowHeight);
//void setSimulation(Simulation &simulation) { *(this->simulation) = simulation; }
Simulation *getSimulation() { return simulation; }
static const int TARGET_FPS = 50; // Frames per second
private:
GameApp(void);
Simulation *simulation;
double frameIntervalList[TARGET_FPS]; // A list containing the time to render the last 60 frames
// Other stuff that doesn't matter
Simulation.h
#pragma once
#include <vector>
#include "GameApp.h"
class Simulation {
public:
Simulation(void);
Simulation(const Simulation ©);
~Simulation(void);
Simulation &operator=(const Simulation &other);
protected:
std::vector<Entity*> *entities;
而且,在 GameApp.cpp 中,在函数initializeContext
中,我有:
#include "GameApp.h"
GameApp *GameApp::instance = NULL;
GameApp::GameApp() {
gamePaused = false;
frameIntervalSum = 0;
this->simulation = new Simulation();
for (int i = 0; i < 60; i++) {
frameIntervalList[i] = 0;
}
}
GameApp *GameApp::initializeContext(const char *gameTitle, const int windowWidth, const int windowHeight) {
instance = new GameApp();
// (...) Rest of initialize funcion
}
问题是,出于一些神秘的原因,当我调用initializeContext
时,它的第一行调用GameApp的构造函数,它创建一个新的Simulation,它正确分配并获得模拟指针的内存地址。但是当程序退出GameApp的构造函数时,在instance = new GameApp();
之后的行中,如果我使用调试器检查新创建的simulator
上的instance
变量,我得到的指针值为0x00000000
,我刚创建的Simulation
已消失。如果我在构造函数上使用堆栈内存,这确实会发生,但我显然正在使用new
,我猜是以正确的方式创建新的Simulation变量。这里可能会发生什么?
此外,setSimulation
文件上有一个注释GameApp.h
函数。当我把这个没有注释时,我得到编译器错误2582,“运算符=函数在模拟中不可用”。这可能与我的问题有关吗?
编辑:问题确实是带有硬编码大小的for循环。我在标题中将frameIntervalList
的大小从60更改为50,但忘记在循环中更改它。还更新了代码以显示frameIntervalList
的声明。
答案 0 :(得分:6)
在simulation
成员变量的初始化和GameApp
ctor之后的代码之间执行的唯一代码是初始化frameIntervalList
的for循环,因此使用硬编码进行初始化如果你不幸,大小可能会覆盖simulation
变量的值。 (或者很幸运,因为它可以帮助你早点抓到一个非常丑陋的虫子!!!: - )