You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

第一段C++代码报std::bad_alloc错误,第二段正常,求原因

解析std::bad_alloc错误:两段C++代码的差异原因

嘿,我来帮你搞清楚这个问题!你碰到的std::bad_alloc错误,本质是程序一直在疯狂分配内存直到耗尽,而根源就是第一段代码的循环逻辑有bug,导致无限循环了。

先拆解第一段代码的循环逻辑:

while(n) {
    res.push_back((n%26) + 'A');
    n=n/26;
    n-=1;
}

举个最简单的例子,当输入n=1时,执行流程是这样的:

  1. 先计算n%26=1,往res里塞字符'B'
  2. n = 1/26,整数除法结果是0
  3. n -=1,把0变成了-1
  4. 循环条件while(n)判断的是“n是否非零”,而负数-1在布尔语境里是true,所以循环会继续跑!

接下来的每一轮循环里,n会一直是-1

  • n%26在C++里结果是负数(因为被除数是负的),比如-1%26=-1,加'A'会得到一个无效字符,但这不是致命问题
  • n = -1/26还是0,然后n -=1又变回-1
    就这么无限循环下去,res会不断往里面加字符,直到系统内存被榨干,自然就抛出std::bad_alloc错误了。

再看第二段正确的代码:

while(n) {
    n-=1;
    res.push_back((n%26) + 'A');
    n=n/26;
}

同样用n=1来测试:

  1. 先执行n -=1n变成0
  2. n%26=0,往res里塞'A'
  3. n = 0/26还是0,循环条件while(n)不满足,循环直接终止,完美结束。

核心差异总结

  • 第一段代码的操作顺序错了:在把n除以26之后才减1,导致当n原本是1的时候,最终会变成负数,触发无限循环耗尽内存。
  • 第二段代码先减1再处理,确保当n降到1时,处理后会变成0,循环能正常终止。

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

火山引擎 最新活动