我用这些二维数组(C ++)耗尽了内存吗?

时间:2012-04-28 00:54:25

标签: c++ memory multidimensional-array crash stack-overflow

我尝试将此C ++代码作为Windows控制台应用程序运行,但是当它启动时,会立即关闭,只给我一个标准的“此程序已停止工作”错误,Windows通常会给我。

该程序的主要功能是(在它之后省略了一些额外的代码):

int main() {
    cout << "FIRST LINE";
    int fract[501][501];
    int rfract[501][501];
    int nufract[501][501];
    int nurfract[501][501];
    int snufract[501][501];
    int snurfract[501][501];
    system("PAUSE");
    return 0;
}

有趣的是,如果我只有前2个数组,程序运行正常,但如果我有其他4个数组(甚至只有其中一个),程序会在启动时崩溃。我使用的计算机有4 GB的RAM,我没有得到任何有用的错误消息,虽然这似乎是问题所在。如果我将它们的大小更改为[101][101](从~1.2 MB变为~50kB),问题就解决了,但我输入函数的空间较小。有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

堆栈的大小比堆的大小小很多。分配有newmalloc的任何内容都在堆上,但如果您不小心,可以非常快速地填满堆栈。

给定网站,你可能会得到一个包含这么多大型阵列的Stack Overflow。

要做到这一点,请尝试以下代码:

#include <iostream>

int main(int argc, char* argv[])
{
int sarr2d[5][10];
typedef int dimension[10];
dimension* arr2d = new dimension[5];

for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 10; j++)
    {
        sarr2d[i][j] = i*j;
    }
}

for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 10; j++)
    {
        arr2d[i][j] = i*j;
    }
}

// print it out
for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 10; j++)
    {
        std::cout << arr2d[i][j] << " ";
    }
    std::cout << "\n";
}

delete [] arr2d;
return 0;
}

这是受问题C++ Multi-dimensional Arrays on the Heap

的启发

答案 1 :(得分:1)

堆栈大小通常限制为相当小的默认大小。如果您需要更大的堆栈,通常可以告诉链接器(以系统特定的方式)。

在这种特殊情况下,您还可以选择在main函数的的静态内存空间中分配变量。该空间通常比堆栈空间大得多。

int fract[501][501];
int rfract[501][501];
int nufract[501][501];
int nurfract[501][501];
int snufract[501][501];
int snurfract[501][501];

int main() {
    cout << "FIRST LINE";

    system("PAUSE");
    return 0;
}

答案 2 :(得分:0)

如果你真的想要堆栈上的项目,你可以使用/ F开关,如果你使用的是Microsoft编译器,或者你可以在链接你的程序时指定堆栈的大小。我可能会选择/ F开关。但是,这可能会占用堆空间(堆栈和堆上的限制)。

这是MSDN上关于增加堆栈大小的链接:

http://social.msdn.microsoft.com/Forums/da-DK/Vsexpressvc/thread/2a5b32b6-683b-4729-92d3-45ed7a89ef3f