Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取错误:在抛出';std::bad::alloc';什么():std::坏的_C++_Memory_Error Handling_Segmentation Fault_Bad Alloc - Fatal编程技术网

C++ 获取错误:在抛出';std::bad::alloc';什么():std::坏的

C++ 获取错误:在抛出';std::bad::alloc';什么():std::坏的,c++,memory,error-handling,segmentation-fault,bad-alloc,C++,Memory,Error Handling,Segmentation Fault,Bad Alloc,获取错误获取错误:在抛出std::bad_allocwhat():std::bad_alloc #include <iostream> #include <inttypes.h> using namespace std; int64_t fibonacci(int64_t n,int64_t m) { int64_t *fibarray = new int64_t[n]; for(int64_t i=0; i<n; i++) {

获取错误获取错误:在抛出
std::bad_alloc
what():std::bad_alloc

#include <iostream>
#include <inttypes.h>

using namespace std;

int64_t fibonacci(int64_t n,int64_t m) {
    int64_t *fibarray = new int64_t[n];
    for(int64_t i=0; i<n; i++)
    {
        if(i<=1)
            fibarray[i]=i;
        else
            fibarray[i]=(fibarray[i-1]+fibarray[i-2])%1000;
    }
    int64_t rett = (fibarray[n-1]%m);
    delete []fibarray;
    return rett;
}

int main() {
    int64_t n=0,m=0;
    cin>>n>>m;
    cout<<fibonacci(n+1,m);
}
#包括
#包括
使用名称空间std;
int64_t斐波那契(int64_t n,int64_t m){
int64_t*fibarray=新的int64_t[n];
对于(int64_t i=0;in>>m;

正如其他人已经指出的,这可能是n太大的问题

试着替换

int64_t *fibarray = new int64_t[n];


甚至在进入循环之前检查null。这是一种很好的做法,特别是因为您向用户公开n和m的值时没有任何限制或检查有效性。

多大是
n
?多大是
n
?它可能是大的,与原始问题无关,但您不需要存储之前的所有n-1斐波那契数计算Fib(n)。是的,我可以通过递归来做,但它需要更多的时间…它与递归无关,递归不会比迭代花费更多的时间。你仍然不需要数组,你只需要三个值-
f[n]
f[n-1]
f[n-2]
。你不需要存储
f[0]
f[n-3]
。我的程序被卡住了。我没有收到任何错误,但它被卡住了…我正在为2816213588运行它。同样,对于一个如此大的数字,您将遇到一些溢出,尤其是试图将其存储到另一个int64。例如,仅从该序列中添加最后2个数字,而您已经超出了ui的范围NT64!您可以将返回值更改为双值和/或将N值限制在最大范围内的某个值。我建议后者。作为一个旁注,考虑一下FiBARLY正在使用多少内存。假设您在硬件上运行,其中一个It64占用8个字节的内存。8×2816213588=225297。08704字节。对于单个变量来说,这大约是21GB的ram!有时这些事情是不可避免的,但正如Paul已经提到的,这不是这些情况之一。您只需要跟踪前2个fib值来计算当前值
int64_t *fibarray = new(nothrow) int64_t[n];
if (fibarray == nullptr) return -1; // now check for null