程序运行崩溃,提示vector subscript out of range,求排查问题原因
解决vector subscript out of range的崩溃问题
咱们一步一步拆解你遇到的问题,先看代码里的核心错误:
1. 直接触发崩溃的原因:下标越界
你的代码里,每次循环先执行Deposits.resize(contor),这会把vector的大小设置为contor。但vector的下标是从0开始的,所以此时合法的下标范围是0到contor-1。可你紧接着就访问Deposits[contor]——这个下标已经超出了vector的有效范围,直接触发了C++标准库的断言检查,导致程序崩溃。
哪怕你去掉了resize,问题依然存在:初始时vector是空的(size=0),而contor从1开始,你直接访问Deposits[contor]相当于访问一个根本不存在的元素,operator[]不会自动帮你扩容创建元素,自然还是越界崩溃。
2. 隐藏的陷阱:while (!fin.eof())的错误用法
这个循环条件本身就有问题:fin.eof()只有在读取操作失败且确实到达文件末尾时才会返回true。也就是说,当最后一次读取成功后,循环会继续执行,此时再执行fin >> Deposits[contor]会失败,但循环体仍然会走完,contor继续递增,这会让下标越界的问题雪上加霜。
正确的写法应该是这样
我们可以用更安全的方式读取数据,同时避免手动管理vector的大小:
std::vector<DepositCustomers> Deposits; std::ifstream fin("in.txt"); DepositCustomers temp; // 直接用读取操作作为循环条件:读取成功才进入循环 while (fin >> temp) { // 自动扩容并添加元素,无需手动计算下标 Deposits.push_back(temp); }
为什么这样能解决问题?
- 避免下标计算错误:用
push_back自动处理vector的扩容和元素添加,不需要手动resize,也不用操心下标范围。 - 更可靠的循环条件:
fin >> temp会返回流对象本身,当读取失败(比如到达文件末尾、数据格式错误)时,流对象会被转换为false,循环直接退出,不会出现多读一次的情况。
额外提醒
如果以后必须手动访问vector的下标,一定要确保下标满足0 <= 下标 < vector.size(),否则很容易触发越界错误。另外,while (!fin.eof())这种写法几乎在所有情况下都应该避免,直接用输入操作作为循环条件才是正确的做法。
内容的提问来源于stack exchange,提问作者Bogdy
相关产品推荐
相关产品推荐

