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