2012-04-28 61 views
0

我尝试运行这个C++代码作为Windows控制台应用程序,但是当它启动时,它立即关闭,只给我一个Windows通常给我的标准“这个程序已经停止工作”的错误。我用这些二维数组(C++)耗尽内存吗?

该方案的主要功能是(与位的额外的代码后它忽略):

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内存的计算机,并且我还没有收到任何有用的错误消息,但似乎是这样的问题。如果我将它们的大小更改为[101][101](从大约1.2 MB到大约50kB),问题就解决了,但我没有更多的空间来输入函数。有没有办法解决这个问题?

+4

你可以尝试在运行时分配它们;堆通常比堆栈大很多。 – Bojangles 2012-04-28 00:55:44

回答

3

堆栈的大小比堆的大小小得多。任何分配为newmalloc的东西都会堆积如山,但如果您不小心,可以非常快速地填满堆栈。

假设网站,你可能会得到堆栈溢出与这么多大型数组。

而要做到这一点,试试下面这段代码:

#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

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

在这种特殊情况下,您还可以选择在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; 
}