我收到以下错误:在抛出 'std::bad_alloc' 的实例后调用终止
Posted
技术标签:
【中文标题】我收到以下错误:在抛出 \'std::bad_alloc\' 的实例后调用终止【英文标题】:I am getting the following error: terminate called after throwing an instance of 'std::bad_alloc'我收到以下错误:在抛出 'std::bad_alloc' 的实例后调用终止 【发布时间】:2020-02-24 16:20:27 【问题描述】:好的,所以我有一个重复 n 次的字符串 s。例如,我有“aba”和 n = 10,我想找到 a 的数量。所以在这种情况下 (abaabaabaa) 我们有 7 个 a。我编写了以下代码,通过了一些测试用例,但是当 n 很大时,我得到了错误: 在抛出 'std::bad_alloc 的实例后调用终止。 有没有办法解决它?谢谢。
long repeatedString(string s, long n)
long i = 0, j = 0, cnt = 0;
long sz = s.size();
vector<char> ar;
while (i < n)
ar.push_back(s[j]);
j++;
if (j >= sz)
j = 0;
i++;
i = 0;
while (i < n)
if (ar[i] == 'a')
cnt++;
i++;
return cnt;
【问题讨论】:
请edit您的问题与minimal reproducible example 或SSCCE (Short, Self Contained, Correct Example) Offtopic:您应该提前预订ar
。 ar.reserve(n)
n
在失败之前有多大?如果你重复s
数十亿次,你可能根本没有足够的内存来表示结果字符串。
@ François Andrieux 如果我这样做,我就没有得到正确数量的 a。 “aba”中a的数量是2。但是如果我做2 * 10,我应该得到7(abaabaabaa)时得到20(abaabaabaa)
std::bad_alloc 的唯一原因是Out of memory。例如系统没有足够的空闲内存来分配请求的数量,或者内存碎片来分配这个块。
【参考方案1】:
基本上,原因是您的内存不足。当您执行push_back
时,向量可能正在重新分配,这将需要capacity + capacity * 2
(乘数可能会有所不同)在连续分配中的空间量。如果您提前预订,这将解决该问题,但您仍需要n
连续字节的内存。
更好的解决方案是只读取字符串并进行一些乘法运算,如下所示:
size_t repeatedString( const std::string &s, size_t n )
size_t sz = s.size();
size_t cnt = 0;
for ( const char &c : s )
if ( c == 'a' )
++cnt;
size_t mult = n / sz;
cnt *= mult;
size_t rem = n % sz;
for ( size_t idx = 0; idx < rem; ++idx )
if ( s[idx] == 'a' )
++cnt;
return cnt;
这样您就不需要分配额外的n
字节,从而减少了内存。
【讨论】:
做到了。谢谢!!以上是关于我收到以下错误:在抛出 'std::bad_alloc' 的实例后调用终止的主要内容,如果未能解决你的问题,请参考以下文章
在抛出 'std::length_error' 的实例后调用终止
在抛出 'std::length_error' 的实例后调用终止