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

C++代码运行时直接触发vector越界错误且无输出,求解析

为什么这段vector循环代码直接触发越界错误且无输出?

问题代码

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    vector<int> v{1, 23, 4, 4, 5, 566, 67, 7, 87, 8, 8};

    size_t s = v.size();

    for (size_t i = 0; i < s; i++)
    {
        cout << v.at(i) << " ";
        v.pop_back();
    }

    return 0;
}

问题现象

程序运行直接触发out of bounds error,且无任何输出,与预期的“打印一半元素后才越界”不符。


原因分析

1. 越界触发时机远早于预期

  • 初始时v.size()为11,你将这个固定值存在变量s中,循环条件i < s意味着循环会执行11次(i从0到10)。
  • 但每次循环都会调用v.pop_back(),导致vector的有效元素数量持续减少:
    • 第1次循环:i=0,vector当前有11个元素,v.at(0)合法,执行pop_back后元素数变为10
    • 第2次循环:i=1,vector当前有10个元素,v.at(1)合法,执行pop_back后元素数变为9
    • ...
    • 第6次循环:i=5,vector当前有6个元素,v.at(5)合法,执行pop_back后元素数变为5
    • 第7次循环:i=6,此时vector只剩5个元素(索引范围0~4),v.at(6)直接访问不存在的位置,触发越界错误。
  • 你的预期错误在于:循环条件用的是初始的固定size值,而非每次获取vector的当前size,因此循环不会在元素减半时自动停止。

2. 无输出的本质:缓冲区未刷新

  • 代码中ios_base::sync_with_stdio(false); cin.tie(NULL);关闭了C/C++流同步,且解除了cin与cout的绑定。
  • cout默认采用行缓冲模式,只有遇到endl、缓冲区满或手动调用flush()时,才会把缓冲区内容输出到控制台。
  • 代码中仅用cout << v.at(i) << " ";输出,未触发刷新操作,程序崩溃时,之前输出的内容还留在内存缓冲区中,没有被打印到控制台,所以看起来“无输出”。

修正方案

方案1:遍历直到vector为空(最直观)

如果需要逐个打印元素并删除最后一个,直接检查vector是否为空即可:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    vector<int> v{1, 23, 4, 4, 5, 566, 67, 7, 87, 8, 8};

    while (!v.empty())
    {
        cout << v[0] << " "; // 打印第一个元素
        v.pop_back();
        // 如果需要从后往前打印,替换为:
        // cout << v.back() << " ";
        // v.pop_back();
    }
    cout << endl; // 刷新缓冲区,确保所有输出显示

    return 0;
}

方案2:仅打印前半部分元素

如果你的需求是打印初始vector的前半部分元素,直接基于初始size计算即可:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    vector<int> v{1, 23, 4, 4, 5, 566, 67, 7, 87, 8, 8};

    size_t half_size = v.size() / 2;
    for (size_t i = 0; i < half_size; ++i)
    {
        cout << v[i] << " ";
    }
    cout << endl;

    // 如需删除后半部分元素,执行对应次数的pop_back
    for (size_t i = 0; i < half_size; ++i)
    {
        v.pop_back();
    }

    return 0;
}

内容的提问来源于stack exchange,提问作者Aditya Krishna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:18:13