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

Segmentation fault while trying to change game state

本文关键字:分段 错误 状态 游戏      更新时间:2023-10-16

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

下面是一个最小代码示例:

#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;
}
由于某些原因,stateManager没有在GameState构造函数中设置。

所以试试这个:

class GameState {
public:
    GameState(GameStateManager* StateManager) : stateManager(StateManager) 
    {   
    };
    virtual ~GameState();
    virtual void update() = 0;
    GameStateManager* stateManager;
};