std::向量成员变量 EXC_BAD_ACCESS

std::vector member variable EXC_BAD_ACCESS

本文关键字:BAD ACCESS EXC 变量 向量 成员 std      更新时间:2023-10-16

我的类load_game_state(定义(有一个vector<shared_ptr<SaveGameState>>类型的成员变量_saveGameItems,并且永远不会初始化(它不需要(。

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

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

我的代码:

load_game_state.cpp

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;
}

load_game_state.h

#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

保存游戏项如下所示:

class SaveGameItem {
    public:
    SaveGameItem();
    SaveGameItem(std::string filePath, std::string timestamp, std::string name);
    const std::string &get_filePath() const;
    void set_filePath(const std::string &_filePath);
    const std::string &get_timestamp() const;
    void set_timestamp(const std::string &_timestamp);
    const std::string &get_name() const;
    void set_name(const std::string &_name);
    ~SaveGameItem();
private:
    std::string _filePath;
    std::string _timestamp;
    std::string _name;
};

发现问题。 _saveGameItems尚未初始化,因为调用getFilePathsOfSaveGames()的类的构造函数是在另一个类的构造函数中调用的,以防止初始化_saveGameItems