C++将array替换为std::vector后程序运行异常是什么原因?
问题原因
你的代码存在数组越界访问的未定义行为,之前使用原生动态数组时没有出现异常只是概率性巧合,替换为std::vector后内存布局变化触发异常是符合预期的,并不代表std::vector本身存在问题。
具体错误点定位
问题出在你写的外层for循环逻辑:
for (; i >= 0; A[i]++)
C++中for循环的执行顺序为:
- 判断循环条件
i >= 0,成立则进入循环体 - 循环体执行完成后,无条件执行第三个循环表达式,再回到第一步判断条件
你在循环体内部的内层for循环,会把变量i递减到-1才退出循环体,此时会直接执行A[i]++也就是A[-1]++,非法访问了vector下标为-1的内存位置,属于典型的缓冲区越界错误,这就是程序偶现异常的根源。
修复方案
把A[i]++的操作挪到循环体内,且只在i为合法值的时候执行即可,参考修改后的代码:
#include <iostream> #include <vector> int main() { int n = 3; for (int k = 1; k <= 4; ++k) { std::vector<int> A(k, 0); int i = 0; // 调整循环逻辑,移除循环头的A[i]++ for (; i >= 0; ) { for (int j = 0; j < k; ++j) { std::cout << A[j] << " "; } std::cout << "\n"; for (i = k - 1; i >= 0 && A[i] == n - 1; i--) A[i] = 0; // 仅i合法时执行自增 if (i >= 0) { A[i]++; } } } return 0; }
内容的提问来源于stack exchange,提问作者expression
相关产品推荐
相关产品推荐

