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

C++用函数返回的vector初始化新vector报std::logic_error如何解决

问题根因排查
  • 核心报错原因来自split函数的非法初始化:string temp = 0; 这行代码会将整数0隐式转换为const char*类型的空指针,调用std::string构造函数时直接触发你收到的basic_string::_M_construct null not valid异常。
  • split函数存在逻辑缺陷:遍历到分隔符才存储临时变量,且存储后未清空临时变量,会导致每行最后一个字段丢失、后续字段拼接前缀错误。
  • myMembers函数存在语法与逻辑问题:getline传入了不存在的文件对象myFile(实际定义的文件对象为file);读取的行字符串和split返回的数组重名,属于变量重定义;缺少文件打开状态判断、split返回结果长度判断,容易触发越界异常。
修复方案

1 修复split函数

vector<string> split(string myString, char delimiter){
    string temp; // 初始化为空字符串,禁止赋值0
    vector<string> splitString;

    for (int i = 0; i < myString.size(); i++){
        if (myString[i] != delimiter){
            temp += myString[i];
        } else {
            splitString.push_back(temp);
            temp.clear(); // 存储后清空临时变量,避免字段拼接
        }
    }
    // 补充存储最后一个无尾部分隔符的字段
    if (!temp.empty()) {
        splitString.push_back(temp);
    }
    return splitString;
}

2 修复myMembers函数

vector<string> Person::myMembers(){
    fstream file;
    file.open("myFile.txt");
    // 新增文件打开状态判断
    if (!file.is_open()) {
        return {};
    }
    string lineStr;
    vector<string> mems;
    
    // 修正getline参数,修改变量名避免重名冲突
    while(getline(file, lineStr)){
        vector<string> lineItems = split(lineStr, ',');
        // 新增长度判断,避免空行/格式异常行触发越界
        if (lineItems.size() >= 1) {
            mems.push_back(lineItems.at(0));
        }
        for (int i = 5; i < lineItems.size(); i++){
            mems.push_back(lineItems.at(i));
        }
    }
    file.close();
    return mems;
}

3 调用代码无需修改,直接使用vector<string> mems = myMembers();即可正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:06:03