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)直接访问不存在的位置,触发越界错误。
- 第1次循环:i=0,vector当前有11个元素,
- 你的预期错误在于:循环条件用的是初始的固定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
相关产品推荐
相关产品推荐

