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

VS2022中C++程序抛出std::bad_array_new_length异常求助

排查std::bad_array_new_length异常的原因及修复方案

核心异常触发点

  • 循环变量误用导致i无限膨胀:在查找最大值的for循环中,循环条件为n < i + 1,但循环体内递增的是i而非n。这会让i持续增大,最终超出int类型的取值范围变为负数,执行new int[i+1]时传入非法的负长度,直接触发std::bad_array_new_length异常。

其他潜在问题

  • while(!fin.eof())的读取逻辑缺陷:这种写法会导致最后一个元素被重复读取一次,因为eof()仅在读取失败后才会变为true,最终i的值会比实际元素数量多1。
  • 固定数组arr的越界风险:arr是固定大小的1000元素数组,若input.txt中的元素超过1000个,会直接触发数组越界,破坏内存结构。
  • 未检查文件打开状态:若input.txt不存在或无法读取,fin会处于错误状态,后续读取操作会失败,导致arr中存储随机值,后续逻辑全部失效。

修正后的代码

#include <fstream>
#include <algorithm>

using namespace std;
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");

    // 检查文件是否成功打开
    if (!fin.is_open()) {
        return 1;
    }
    if (!fout.is_open()) {
        fin.close();
        return 1;
    }

    int arr[1000];
    int i = 0;
    int num;
    // 正确读取逻辑:判断读取是否成功+限制数组容量
    while (fin >> num && i < 1000) {
        arr[i] = num;
        i++;
    }

    // 处理空文件情况
    if (i == 0) {
        fin.close();
        fout.close();
        return 0;
    }

    // 查找最大值,修复循环变量错误
    int max_val = arr[0];
    for (int n = 0; n < i; n++) {
        if (arr[n] > max_val) {
            max_val = arr[n];
        }
    }

    // 创建对应长度的动态数组
    int* arr2 = new int[i];
    for (int n = 0; n < i; n++) {
        arr2[n] = max_val - arr[n];
        fout << arr2[n] << " "; // 添加分隔符避免输出粘连
    }

    delete[] arr2;
    fin.close();
    fout.close();

    return 0;
}

额外优化建议

  • 改用std::vector<int>替代固定大小数组,彻底消除越界风险,无需手动管理内存。
  • 用std::max_element简化最大值查找逻辑:int max_val = *max_element(arr, arr + i);(需包含<algorithm>头文件)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:37:18