std :: vector成员变量EXC_BAD_ACCESS

时间:2018-01-17 15:06:46

标签: c++ c++11 vector exc-bad-access

我的班级load_game_state(定义)有一个类型为_saveGameItems的成员变量vector<shared_ptr<SaveGameState>>,并且从未初始化(它不需要)。

尝试在此向量上使用push_back()emplace_back()时,出现EXC_BAD_ACCESS错误。我不明白为什么我不能在这个向量中添加对象。

填充向量SaveGameData的{​​{1}}个对象。正确构造,每个对象包含三个字符串(即路径,描述和时间戳(实际上只是一个字符串))。

我的代码:

load_game_state.cpp

saves

load_game_state.h

vector<std::string> LoadGameState::getFilePathsOfSaveGames() {
JSONParser jp = JSONParser {};
vector<string> paths = get_all("assets/saves/", ".json");
vector<shared_ptr<SaveGameItem>> saves;



// Extract data
for(auto path : paths) {
    json tmpData = jp.getSaveGame(path);
    saves.emplace_back(make_shared<SaveGameItem>(SaveGameItem(path, tmpData.at("saveTime"), tmpData.at("name"))));
}

_saveGameItems = saves;

}

SaveGameItem 如下所示:

#ifndef RISKY_LOAD_GAME_STATE_H
#define RISKY_LOAD_GAME_STATE_H

#include "state.h"
#include "../risky.h"
#include "../scenes/load_game_scene.h"
#include "load_game_controller.h"
#include "../models/SaveGameItem.h"

#include <boost/filesystem.hpp>

namespace fs = ::boost::filesystem;

class LoadGameState : public State, public LoadGameController {

public:
    LoadGameState(Risky& context, GameEngine& engine, StateManager* stateManager);
    BaseScene& getScene() override;
    void doQuit() override;
    void handleInput() override;
    void update() override;
    ~LoadGameState();

    vector<string> get_all(const boost::filesystem::path& root, const string& ext);

    const vector<shared_ptr<SaveGameItem>> &get_saveGameItems() const;

    void set_saveGameItems(const vector<shared_ptr<SaveGameItem>> &_saveGameItems);

    // TODO get file paths of all JSON files
    vector<std::string> getFilePathsOfSaveGames() override;

    // TODO parse into SaveGameItem objects

    // TODO display these objects


private:
    LoadGameScene _scene;
    Risky& _riskyRef;
    GameEngine& _engineRef;

    // SaveGameItems
    vector<shared_ptr<SaveGameItem>> _saveGameItems;
};

#endif //RISKY_LOAD_GAME_STATE_H

1 个答案:

答案 0 :(得分:0)

发现了这个问题。 _saveGameItems尚未初始化,因为调用getFilePathsOfSaveGames()的类的构造函数在另一个类的构造函数中被调用,导致_saveGameItems被初始化。