尝试更改游戏状态时出现分段错误

时间:2016-07-24 17:09:40

标签: c++ segmentation-fault state-machine

我正在制作一个用于在我的游戏引擎中切换游戏状态(播放 - >菜单 - >设置)的状态机,但是我遇到了分段错误。我可以从上层改变游戏状态,但如何在游戏状态下更改游戏状态?

这是一个最小的代码示例:

#include <iostream>
#include <vector>

class GameStateManager;

class GameState {
public:
    GameState(GameStateManager* StateManager) {
        StateManager = stateManager;
    };

    virtual ~GameState();

    virtual void update() = 0;

    GameStateManager* stateManager;
};

class GameStateManager {
public:
    GameStateManager();
    ~GameStateManager();

    void changeGameState(GameState* state) {
        if(!running) {
            running = true;
        }

        // Cleanup the current state
        if(!gameStates.empty()) {
            for(unsigned int i = 0; i < gameStates.size(); i++) {
                delete gameStates[i];
            }
            gameStates.clear();

            std::cout << "Cleaning up GameState" << std::endl;
        }

       // Store and initialize the new game state
       gameStates.push_back(state);
    };

    void update() {
        if(!gameStates.empty()) {
            gameStates.back()->update();
        }
    };

    std::vector<GameState*> gameStates;
    bool running;
};

class PlayState : public GameState {
public:
    PlayState(GameStateManager* stateManager) : GameState(stateManager) {};
    ~PlayState();

    void update() override {
        // On some flag, initiate the next level
        nextLevel();
    };

    void nextLevel() {
        stateManager->changeGameState(new PlayState(stateManager));
    };
};

int main() {
    GameStateManager stateManager;

    stateManager.changeGameState(new PlayState(&stateManager));

    while(stateManager.running) {
        for(unsigned int i = 0; i < 10000; i++) {
            std::cout << "Round: " << i << std::endl;

            // Segmentation fault here
            stateManager.update();

            // This works
            //stateManager.changeGameState(new PlayState(&stateManager));
        }
        stateManager.running = false;
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

由于某种原因,stateManager未在GameState构造函数中设置。

所以试试这个:

class GameState {
public:
    GameState(GameStateManager* StateManager) : stateManager(StateManager) 
    {   
    };

    virtual ~GameState();

    virtual void update() = 0;

    GameStateManager* stateManager;
};