运行C++文件内容反转程序时报std::length_error异常如何解决
std::length_error 报错原因与解决方案
std::length_error 是C++标准库定义的异常类型,通常在尝试构造长度超过实现支持上限的容器/字符串对象时抛出。结合你提供的主逻辑代码,问题大概率出现在你引入的WordStack、Word类内部实现,或是文件读取的异常分支。
常见触发原因
Word类的setWord方法实现错误:比如计算字符串长度时出现负值,强制转换为无符号size_t后变成超大值,调用string::resize等方法时触发异常;或是传入空字符串时做了错误的长度计算,尝试创建长度非法的字符串对象WordStack类的逻辑错误:push方法的扩容逻辑有误,计算新容量时出现负数/溢出值,构造新存储容器时触发异常- 固定容量的栈实现未做栈满校验,当文件内单词数量超过栈最大容量时错误抛出
length_error isEmpty方法逻辑错误,空栈时返回false导致pop被重复调用,空栈下的pop逻辑尝试构造非法长度的Word对象触发异常
- 文件读取异常:
data.txt不存在/无读取权限时,file >> word读取到无效内容,传入setWord后触发长度错误
排查解决步骤
- 第一步先做文件读取合法性校验,在
file.open("data.txt")后新增判断逻辑,避免读取无效内容:
file.open("data.txt"); if (!file.is_open()) { std::cout << "data.txt打开失败,请检查文件路径和权限" << std::endl; return -1; }
- 第二步排查
Word类的setWord实现,增加入参校验:
void Word::setWord(const std::string& input) { // 可根据业务调整最大允许长度,避免非法长度传入 if (input.empty() || input.size() > 4096) { return; // 也可以抛出明确的业务异常,方便定位 } // 替换你原来的赋值逻辑,避免错误的长度计算 this->inner_word = input; }
- 第三步排查
WordStack类的核心逻辑:- 检查
push的扩容逻辑,确认新容量计算没有溢出、没有出现负数 - 检查
pop方法,优先判断栈是否为空,空栈时直接返回默认Word对象/抛出明确异常,避免操作空内存构造对象 - 验证
isEmpty的返回值是否符合预期,避免空栈时错误返回false导致死循环调用pop
- 检查
- 第四步加调试日志定位:在
setWord、push方法的入口打印入参的长度,快速定位是哪一步传入了非法长度值触发异常
内容的提问来源于stack exchange,提问作者Rishi Batta
相关产品推荐
相关产品推荐

