抛出'std :: bad_alloc'实例后调用C ++终止

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抛出'std :: bad_alloc'实例后调用C ++终止相关的知识,希望对你有一定的参考价值。

给定一个整数,我们需要找到整数的超级数字。

我们使用以下规则定义整数x的超级数字:

如果x只有1位数,那么它的超级数字是x否则,超级数字等于x的数字和的超级数字。这里,数字的数字和被定义为其数字的总和。

例:

super_digit(9875) = super_digit(9+8+7+5) 

= super_digit(29) 

= super_digit(2+9)

= super_digit(11)

= super_digit(1+1)

= super_digit(2)

= 2

任务:给你两个数字nk。你必须计算p.p的超级数字是在数字n连接k时创建的。

我的代码解决了这个问题如下所示。

#include <bits/stdc++.h>
#include <string>
#include <iostream>
#include <math.h>

using namespace std;

int superDigit(string n, int k)
{
    int res=0;
    for (int x = 0; x < n.length(); x++)
    {
        res += n[x] - '0';
    }
    res = k * res;
    if (res < 10)
        return res;
    else
        return superDigit(to_string(res),1);
}

int main() {
    string n;
    int k;
    cin >> n;
    cin >> k;
    cout << superDigit(n, k)<< endl;
    return 0;
}

代码似乎对所有小数字都能正常工作,但是当n1e100000-1k100000时,程序会返回以下错误:

在抛出'std :: bad_alloc'的实例后终止调用

what():std :: bad_alloc

我认为这是一个内存泄漏,但我该如何解决这个问题。泄漏在哪里发生?

答案

你把n当作1e10000-1。这是关于1e10000字符长。假设每个字符大约是1字节大小。然后,

1e10000 bytes = 1e9997 kilobytes = 1e9994 MB = 1e9994 GB = 1e9991 TB正如你所看到的那样,它非常庞大。

以上是关于抛出'std :: bad_alloc'实例后调用C ++终止的主要内容,如果未能解决你的问题,请参考以下文章

多个文件的内存分配错误“在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用” [C ++]

Qt5 抛出 std::bad_alloc

我收到以下错误:在抛出 'std::bad_alloc' 的实例后调用终止

第一个代码中的错误,但第二个正确“在抛出 'std::bad_alloc' what() 的实例后调用终止:std::bad_alloc Aborted(core dumped)”

C++:在计算大字符串的长度时抛出“std::bad_alloc”的实例后调用终止

一段时间后得到 std::bad_alloc