声明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
相关产品推荐
相关产品推荐

