为什么我在Visual Studio中出现堆栈溢出错误

时间:2014-04-07 21:38:54

标签: c++ visual-studio-2013

我是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;
}

2 个答案:

答案 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)

您正在使用自动存储持续时间(即堆栈)分配7个double [N][N]变量。单个双变量的大小为64位(通常),即8个字节;因此总共需要8 * 200 * 200 * 7 = 2240000字节(2.13 MiB)。这可能超过了平台上框架所允许的堆栈空间。

MSDN says默认堆栈大小为1 MiB,而您尝试分配的内容超过1 MiB,因此错误。

除了Jerry建议的替代方案之外,您还可以选择动态,免费存储(通常在堆上)分配,不受堆栈大小的限制。