C ++成员变量在构造函数后丢失值

时间:2014-03-09 21:53:33

标签: c++ memory-management operator-overloading

我的某个班级遇到了问题。我有这两个类,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 &copy);
    ~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的声明。

1 个答案:

答案 0 :(得分:6)

simulation成员变量的初始化和GameApp ctor之后的代码之间执行的唯一代码是初始化frameIntervalList的for循环,因此使用硬编码进行初始化如果你不幸,大小可能会覆盖simulation变量的值。 (或者很幸运,因为它可以帮助你早点抓到一个非常丑陋的虫子!!!: - )