C++程序退出主for循环后崩溃,疑与二维vector释放有关
二维vector退出循环时崩溃的原因与修复
我的代码在主for循环内部运行正常,但退出该循环时立即崩溃。经过调试,我认为这与二维vector「m」的内存释放有关。我从未遇到过此类问题,且自认为已正确初始化「m」。
问题代码
#include <iostream> #include <vector> int main() { std::ios::sync_with_stdio(false); int t; std::cin >> t; std::vector<int> answers(t); for (int i = 0, n, a; i < t; ++i) { int net = 0, sum = 0; std::cin >> n; std::vector<int> input(n); std::vector<std::vector<int>> m(n, std::vector<int>(n, 0)); for (int j = 0; j < n; ++j) { std::cin >> a; input[j] = a; } for (int j = 0; j < n; j += 2) sum += input[j]; for (int j = 0; j < n - 1; ++j) { m[j][j + 1] = input[j] - input[j + 1]; if (j % 2 == 0) m[j][j + 1] *= -1; if (m[j][j + 1] > net) net = m[j][j + 1]; } for (int j = 3; j < n; j += 2) for (int k = 0; k <= n - j; ++k) { m[k][j + k] = m[k][k + 1] + m[k + 2][j + k]; if (m[k][j + k] > net) net = m[k][j + k]; } answers[i] = sum + net; } for (auto i : answers) { std::cout << i << '\n'; } return 0; }
测试输入
1 10 7 8 4 5 7 6 8 9 7 3
问题分析
崩溃的根本原因不是vector内存释放异常,而是数组越界访问导致的内存损坏。
看这段内层循环代码:
for (int j = 3; j < n; j += 2) for (int k = 0; k <= n - j; ++k) { m[k][j + k] = m[k][k + 1] + m[k + 2][j + k]; // ... }
当n=10、j=3时,k的取值上限是n-j=7,此时j+k=3+7=10,但m是n×n的二维vector,索引范围为0~9,访问m[k][10]属于越界操作。这种未定义行为会破坏vector的内部数据结构或其他内存区域,导致后续循环退出、vector销毁时触发崩溃。
修复方案
将内层循环的条件从k <= n - j修改为k < n - j,确保j+k < n,彻底避免越界:
for (int j = 3; j < n; j += 2) for (int k = 0; k < n - j; ++k) { m[k][j + k] = m[k][k + 1] + m[k + 2][j + k]; if (m[k][j + k] > net) net = m[k][j + k]; }
修改后运行测试输入,代码可正常执行输出结果,退出循环时无崩溃现象。
内容的提问来源于stack exchange,提问作者codingcultivator445
相关产品推荐
相关产品推荐

