You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LoadGameState类vector成员调用push_back触发EXC_BAD_ACCESS求助

解决EXC_BAD_ACCESS:向vector<shared_ptr<SaveGameItem>>添加元素时出错

先看你的代码里最致命的问题——getFilePathsOfSaveGames函数的返回值处理错误:

这个函数声明返回vector<std::string>,但函数体末尾没有任何return语句。在C++中,非void类型的函数必须返回对应类型的值,这种遗漏会直接触发未定义行为(Undefined Behavior)。程序的内存布局可能被破坏,这大概率就是你调用push_back/emplace_back时出现EXC_BAD_ACCESS的根源——栈内存被乱改后,_saveGameItems的内部状态已经损坏,后续对它的操作自然会访问到非法内存地址。

修复步骤:

1. 修正函数的返回值逻辑

如果这个函数的设计目的是返回保存文件的路径列表,那在函数末尾补充返回语句:

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;
    return paths; // 补充缺失的return语句
}

如果这个函数的核心作用只是填充_saveGameItems,不需要返回路径列表,那直接把函数的返回类型改成void,同时同步修改头文件中的声明:

// load_game_state.h里的声明修改为
void getFilePathsOfSaveGames() override;

// load_game_state.cpp里的定义修改为
void LoadGameState::getFilePathsOfSaveGames() {
    // 原有逻辑保持不变,无需return语句
    JSONParser jp = JSONParser {};
    vector<string> paths = get_all("assets/saves/", ".json");
    vector<shared_ptr<SaveGameItem>> saves;
    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;
}

2. 额外排查点

修复完上述问题后如果仍有错误,可以检查以下内容:

  • 确认SaveGameItem的构造是否正常:比如tmpData.at("saveTime")和tmpData.at("name")是否确实存在于目标JSON文件中,且是有效的字符串类型。JSON解析出错可能会抛出异常或构造出无效对象,间接导致后续操作异常。
  • 确认调用getFilePathsOfSaveGames的LoadGameState对象有效:排查是否使用了已销毁的对象指针/引用,或者未初始化的对象来调用该方法。

内容的提问来源于stack exchange,提问作者ThvD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:30:04