字符串数据成员的错误指针 - 获取访问冲突

时间:2012-04-28 02:53:36

标签: c++ string class pointers access-violation

编辑:已解决:我刚刚没有初始化currLevel,这导致数据成员上的错误指针。

我正在使用SDL编写一个简单的游戏。游戏以解决迷宫为中心。每个迷宫都有一个相应的文本文件,我的程序会读取该文件并相应地设置一个MazeMap对象。

我是孤立地测试它,似乎初始化很好。但是,当我创建我的Engine类并在其中创建我的MazeMap对象时,我遇到了这种访问冲突,并且Maze的名称在调试器中被标记为坏指针。这是代码:

MazeMap.h:

class MazeMap{
public:
    MazeMap() {}
    ~MazeMap();

    /*Initializes all the data members using a text file of the following format:
    1               |-First line is the level number of the maze
    level.png       |-Background image for the level
    Level Name      |-Name of the level
    4x4             |-Number of rows x cols
    S.XX            |-The actual map:
    X...            |  -S: start location
    XXX.            |  -X: Wall, .: passable ground
    E...            |  -E: end of the level*/
    void init(std::string level_file);

    //Prints the maze to std::cout
    void print() const;

    //Calls uti::apply_surface() on all the surfaces to prepare them for blitting
    // Surfaces are created for each tile.
    // Will be called in Engine::render()
    void drawMaze(SDL_Surface *screen) const;

private:
    std::string                         MazeName; //THE CULPRIT!
    int                                 level,
                                        rows,
                                        cols;
    std::vector< std::vector<Tile> >    tiles;
    SDL_Surface*                        background;

    //Used in init() to get level, rows, cols, and MazeName, 
    // as well as initialize the background image.
    void initMapInfo(std::fstream& map_in);

    //Used in init() to convert the characters in the text file
    // to tiles for the tile vector.
    Tile convert_char_to_tile(char t) const;

    //Used in print() to convert the tiles back to chars for 
    // printing.
    char convert_tile_to_char(Tile t) const;
};

发生运行时错误的initMapInfo函数:

void MazeMap::initMapInfo(std::fstream& map_in){
    char x;
    std::string holder;

        //First line: get level number
    std::getline(map_in, holder);
    level = uti::string_to_int(holder);

    //Second line: get background image file name
    std::getline(map_in, holder);
    background = uti::load_image(holder);

    //Third line: get name of the level
    std::getline(map_in, MazeName); //THIS LINE IS FAILING

    //Fourth line: get rows and cols
    std::getline(map_in, holder);
    std::stringstream s(holder);
    s >> rows >> x >> cols;
}

引擎类:

class Engine{
public:
    Engine();
    void run();
private:
    SDL_Surface   *screen;
    GameState      currentState;
    int            currLevel;   
    MazeMap        levels[NUM_LEVELS];
    Player         player;

    //Initializes the screen and sets the caption.
    void initSDL();

    /******************************************************/
    /* Primary functions to be used in the main game loop */

    //First, input from the player will be taken
    void processInput();
    //Based on the user input, various game world elements will be updated.
    void update();
    //Based on what was updated, the screen will be redrawn accordingly.
    void render();
    /////////////////////////////////////////////////////////
};

run()函数:

void Engine::run(){

    bool play = true;

    MazeMap *curr = &levels[currLevel];
    curr->init(TEST_MAZE);
    curr->drawMaze(screen);

    while(play){
    }
}

感谢任何帮助。我意识到这里有很多代码,为此我道歉。我只想彻底。感谢。

1 个答案:

答案 0 :(得分:1)

@Slims自己找到了原因:

  

已解决:我刚刚没有初始化currLevel,导致数据成员上的错误指针?