1. 程式人生 > >如何解決C/C++中stack overflow問題

如何解決C/C++中stack overflow問題

一般遇到這個問題,有兩個常見的情況,一個是存在函式的遞迴呼叫,另一個是函式中定義了一個較大的陣列或者別的變數。 
1、在函式的遞迴呼叫中,函式中定義的區域性變數所佔的空間要直到遞迴結束才能被釋放,這樣函式不停的遞迴,堆疊早晚會被用完,解決這一問題的辦法是在遞迴函式中每次動態的分配變數的記憶體,在使用結束的時候釋放記憶體。遇到這種情況更改堆疊的最大空間大小是沒有用的,要從程式碼的優化入手。下面以二維陣列的動態分配為例: 
p=new double*[1000];  

 for (int m=0;m<1000;m++)   {      
p[m]=new double[5000];    

}        for(int n=0;n<1000;n++)

  {  

  delete[] p[n]; 

?

1

<br>

  }    

  delete[] p;      
2、堆疊的大小隻有1M,如果在函式中定義了一個佔用記憶體比較大的變數,那麼也會導致堆疊溢位。這種情況只需在定義的時候定義為靜態變數就行了,因為靜態變數是不佔用堆疊記憶體的。如: 
void main() {  int a[10010010]; } 
在函式內定義的變數預設auto型別,也就是棧變數,執行時使用的是棧空間,函式結束後自動清理返回記憶體。這裡在函式內定義如此大的一個數組,已經超過了單個函式可使用的最大棧空間,所以也會提示stack overflow。解決辦法是將其定義為static int型的靜態變數,這樣就不佔用棧空間了。 
void main() {  static int a[10010010]; } 
3、除此之外還可以通過修改堆疊的最大空間來解決問題,把project設定裡的堆疊加大就可以了,預設是1M,你可以加大到10M試試.   具體如下:project-> setting-> link:   在category裡選擇output,在stack的Reserve裡輸入0x10000000試試。對於遇到這樣的問題建議從程式碼方面去解決,不要盲目的依靠修改堆疊空間來解決,畢竟有的問題靠修改空間是解決不了的,如遞迴中產生的stack overflow。