第一段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时,执行流程是这样的:
- 先计算
n%26=1,往res里塞字符'B' n = 1/26,整数除法结果是0n -=1,把0变成了-1- 循环条件
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来测试:
- 先执行
n -=1,n变成0 n%26=0,往res里塞'A'n = 0/26还是0,循环条件while(n)不满足,循环直接终止,完美结束。
核心差异总结
- 第一段代码的操作顺序错了:在把
n除以26之后才减1,导致当n原本是1的时候,最终会变成负数,触发无限循环耗尽内存。 - 第二段代码先减1再处理,确保当
n降到1时,处理后会变成0,循环能正常终止。
内容的提问来源于stack exchange,提问作者Pratyush Sharma




