我是C ++的初学者,并不了解许多后台进程,例如编译器如何分配内存等。我正在使用Visual Studio 2013编写c ++程序。我必须使用visual studio,因为我将matlab链接到我的c ++代码。
我收到堆栈溢出错误,我不知道如何删除它。当我设置N = 100时,我没有收到此错误,但是当我设置较大的N值(例如150,200)时,我得到堆栈溢出错误。
如果有人能指出为什么我在VS中收到此错误,那真的很棒。我使用GCC编译器的代码块测试了相同的代码,它根本不会产生任何错误。
#include<iostream>
using namespace std;
const int N = 200; //Number of grid points
int main()
{
double n = N;
double dx = 4 / (n - 1); double dy = 4 / (n - 1);
double col = n, row = n;
double dt = 0.5*dx; // time step size(dTau)
int itmax = 2500; // max iterations
int i, j, t;
double x[N] = { 0.0 }, y[N] = { 0.0 };
x[0] = -2; y[0] = -2; // define grid
for (i = 1; i < N; i++){
x[i] = x[i - 1] + dx;
y[i] = y[i - 1] + dy;
}
// Initialize variables
double phi_0[N][N], phi_new[N][N], F_0[N][N], F_new[N][N], F[N][N],
Fext[N][N], phi[N][N];
return 0;
}
答案 0 :(得分:4)
默认情况下,Visual Studio创建的堆栈只有几兆字节(或者可能只有一个 - 我不记得确切,但通常只有当前机器上的一小部分内存)。当N变得太大时,你只是使用了更多。
一个明显的选择是将大型数组定义为static
,这样他们就不会在堆栈中。
static double phi_0[N][N], phi_new[N][N], F_0[N][N], F_new[N][N], F[N][N],
Fext[N][N], phi[N][N];
这会强制静态分配数组。在main
中,这几乎没有什么区别,因为main
不允许以递归方式调用。但是,在直接或间接递归的函数中,这可能会导致问题。在这种情况下,您可能希望使用std::vector
,因为这会在免费商店中分配(大部分)其数据,并且仅使用少量固定数量的堆栈内存(通常为12左右)每个矢量-32个字节)。
答案 1 :(得分:1)