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
相关产品推荐
相关产品推荐

