我收到以下错误:在抛出 '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:您应该提前预订arar.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' 的实例后调用终止

谁在抛出(并捕获)这个 MySQL 异常?

(c++) 在抛出一个实例后调用终止

将字母向前移动 3 个字母的程序,错误:在抛出 'std::out_of_range' 的实例后调用终止

在抛出“NSException”(gdb)的实例后调用终止