2012-04-28 43 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; 
}