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

程序运行崩溃,提示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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:14:08