【问题标题】:got bad_alloc exception when appending a std string附加 std 字符串时出现 bad_alloc 异常
【发布时间】:2017-12-21 08:08:59
【问题描述】:

考虑:

int main(){    
    string str("aaaaaaaaaa");        
    for (int i = 0; i < 1000; i++)
    {
       str += str.data();
    }
}

对于较大的i,会出现“bac_alloc”错误。 有什么办法可以防止这种情况发生吗? 如果没有,还有什么替代方法(加起来长字符串)?

【问题讨论】:

  • 简单写str += str;有什么问题?
  • 您认为到底发生了什么?根据我的计算,您正在执行“aaaaaaaaaa”* 2^1000,这等于 1,07150860718626732094842504906e+302 字节的已用内存
  • 我认为使用 .data() 可以解决问题,但还是一样。
  • 你从哪里得到 2^1000?
  • 一次又一次地加倍,即x*2*2*2*2....,1000次,表示x*2^1000。我不知道你的机器,但我很确定这不会工作。

标签: c++ stl std


【解决方案1】:

您的代码str += str.data() 一次又一次地将字符串翻倍,1000 次。这将最终形成一个长度为10*2^1000 的字符串,这远远无法放入内存中。您可能想将 "aaaaaaaaa" 连接一千次,而不是将字符串加倍 1000 次:

string str;
for (int i = 0; i < 1000; i++) {
   str += "aaaaaaaaaaa";
}

【讨论】:

  • 餐巾纸背面,10 × 2¹⁰⁰⁰ 似乎是一个很大的数字。比地球上创造的所有 RAM 总和还要大。不仅仅是所有的硬盘存储空间。一个很大的字符串可能需要另一种表示。整个地球由大约1.33 × 10⁵⁰ 个原子组成,因此计算机的大小约为地球的一个 googol 大小。这是很多。
猜你喜欢
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 2010-10-01
  • 2016-03-31
相关资源
最近更新 更多