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

声明new int[n]时触发std::bad_alloc错误,数组拆分程序求助

解决数组拆分时new内存抛出错误的问题

嘿,我来帮你排查这个问题!你说count函数运行正常,但在new数组的时候报错,哪怕分开声明和赋值也没用,那大概率是numPos或numNeg的数值有问题,或者是count函数的参数传递出了岔子,咱们一步步来分析:

最可能的原因:count函数参数未用引用传递

如果你的count函数声明是这样的:

void count(int* userList, int n, int numPos, int numNeg) {
    // 统计正数和负数的逻辑
}

那麻烦就来了!这里的numPos和numNeg是传值参数,函数内部对它们的修改只会作用于局部变量,外面的变量根本不会被更新。也就是说,你在new的时候用的numPos和numNeg可能还是未初始化的垃圾值(比如随机负数),这时候new int[负数]肯定会抛出bad_alloc异常。

修复方法:改用引用传递

把count函数的参数改成引用类型,这样函数内部的修改会直接作用于外部变量:

void count(int* userList, int n, int& numPos, int& numNeg) {
    // 先初始化计数为0!
    numPos = 0;
    numNeg = 0;
    for (int i = 0; i < n; i++) {
        if (userList[i] < 0) {
            numNeg++;
        } else {
            numPos++;
        }
    }
}

记得调用count的时候直接传变量名就行,不用加&:

int numPos, numNeg;
count(userList, n, numPos, numNeg);

第二步:确认numPos和numNeg的数值是否合理

就算参数传递没问题,也可能是count函数的统计逻辑出错,导致numPos或numNeg变成负数(比如循环边界写错,或者计数变量初始值不对)。你可以在new之前加一行调试输出:

// 在new之前打印数值
cout << "正数数量:" << numPos << ",负数数量:" << numNeg << endl;
int *negList = new int[numNeg];
int *posList = new int[numPos];

如果输出的数值是负数或者超大的离谱值,那就要去检查count函数的循环逻辑了。

更稳妥的替代方案:用std::vector代替手动new

其实在C++里,手动管理动态内存很容易出问题,不如直接用std::vector,它会自动处理内存分配,还能避免计数错误的问题:

#include <vector>

// 不用先计数,直接遍历数组填充vector
std::vector<int> negList;
std::vector<int> posList;

for (int i = 0; i < n; i++) {
    if (userList[i] < 0) {
        negList.push_back(userList[i]);
    } else {
        posList.push_back(userList[i]);
    }
}

这样不仅不用管new和delete的问题,代码也更简洁安全。

你可以先从检查count函数的参数传递开始,这应该是最常见的问题根源!

内容的提问来源于stack exchange,提问作者Førty Twø Bus Drivers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:23:43