在将语句赋值期间C++ "Exception has occurred"到双精度数组



我对C++比较陌生,我正在尝试编写一个简单的代码来求解偏微分方程。

解决方案代码以时间增量dt的不同值重复多次。在第五次迭代(j=4(中,我的IDE抛出一个错误:

出现异常。EXC_BAD_ACCESS(代码=2,地址=0x7ffeeecbd490(

当它试图给一个名为u2的双数组赋值时。错误具体发生在以下线路上:

u2[0] = 1;

在一些调试中,我注意到VisualStudioCode在上一行重新初始化u2的过程中做了一些不同的事情。当j=0、1、2和3时,变量列表将u2显示为后的所有零值

double u2[numTimes[j]];

当j=4时,u2的元素突然显示为"?"&";。这向我表明,重新初始化可能没有如预期的那样发生。例如,也许dt导致u2的大小大于c++所能处理的大小?一些谷歌用户不同意我达到了1000000个元素的大小限制。这是怎么回事?

编辑:当我查看std::vector时,只需键入

vector<double> u1[1000000];

导致完全相同的错误消息。因此,std::vector似乎不是一个解决方案。我应该将u1和u2动态更新到所需的元素数量,而不是预先分配吗?但我不明白为什么这会成为可能。

编辑2:

要为矢量预先分配内存,请执行以下操作:

std::vector<double> u;
u.reserve(1000000);

不要这样做:

std::vector<double> u[1000000];

数组式内存分配会导致与原始实现相同的问题,因为您创建的是一百万个向量,而不是1000000个向量。

#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
// Global System Parameters
double g = // a real value;
double R = // a real value;
double f_du1dt(double u2)
{
return // some equation;
}
double f_du2dt(double u1)
{
return // some other equation;
}
int main()
{
double dt[] = {1, 0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001, 0.00000001};
int numDts = sizeof(dt) / sizeof(dt[0]);
double tmax = 10;
int numTimes[numDts];
for (int k = 0; k < numDts; k++)
{
numTimes[k] = tmax / dt[k] + 1;
}
// Iterate through all dts
for (int j = 0; j < numDts; ++j)
{
double u1[numTimes[j]];
u1[0] = 0;
double u2[numTimes[j]];
u2[0] = 1; // This is the line where the problem happens
double du1dt;
double du2dt;
// cout << numTimes << endl;
// Euler Integrator
for (int i = 0; i < numTimes[j]; i++)
{
// Integrator here
}
/* 
Output to a csv file to plot
*/
}
return 0;
}

j为4时,您的numTimes[k]应为100001。您在堆栈上分配了两个大小相同的double数组。这使其大约为1.6MB。在某些环境中,这可能会超过您的堆栈大小。j的值越高,情况就越糟。

我建议不要使用在堆栈上分配的可变长度数组。请改用std::vector,它可以根据需要自动分配和重新分配内存以适应自身。

相关内容

最新更新