C++循环拼接字符串抛出std::bad_alloc是否因字符串长度限制导致?
错误原因解答
错误是否由字符串长度限制引发?
不是,该错误和编程语言默认的字符串长度限制无关,是代码逻辑问题导致内存被耗尽引发的。
具体根因
std::bad_alloc是C++标准库在堆内存分配请求无法被满足时抛出的异常,你的代码逻辑会让字符串内存占用指数级暴涨,远超过普通设备的可用内存:
for(int i=1;i<=50;i++) { s+=to_string(i)+s; }
我们可以简单推演字符串长度变化:
- 初始状态:s为空,长度为0
- 第1次循环结束:s长度 = 1 = 2^1 -1
- 第2次循环结束:s长度 = 3 = 2^2 -1
- 第3次循环结束:s长度 = 7 = 2^3 -1
- ...
- 第n次循环结束:s长度 = 2^n -1
循环到第30次时,字符串长度已经超过10亿,需要占用约1GB内存;循环到第40次时需要的内存就达到了1TB,普通消费级设备完全无法提供这么大的连续内存空间,自然会在循环中途内存分配失败抛出std::bad_alloc。
修复方案
如果你是想把1到50的数字依次拼接在字符串末尾,直接修改为如下逻辑即可,最终字符串长度不足100,不会出现内存问题:
for(int i=1;i<=50;i++) { s += to_string(i); }
内容的提问来源于stack exchange,提问作者Akash Parmar
相关产品推荐
相关产品推荐

