首頁 > C/C++, 未分類 > Stack overflow

Stack overflow

2010年3月17日 Austin 發表評論 閱讀評論

最近遇到的一個問題Stack overflow,不難解~改用new&delete就對了丫,結果還是錯,找了一下資料是用new&delete沒錯,但是為啥不行,最後發現原來還有別的地方有用一樣的數字來宣告,程式如下:
一開始找出來發生錯誤的地方(我一直以為是這錯@@a)

const unsigned int numSolution1 = 50;

// 掛
Solution sol1[numSolution1];

// 正常來說改成這樣就OK了,結果調成100還是會掛
Solution *sol1 = new Solution[numSolution1];

最後發現~另外還有幾個個檔案有類似下面的程式:

// 掛,因為這邊也要改用new
const unsigned int numSolution2 = numSolution1 * 2;
Solution sol2[numSolution2];

 
Stack overflow
Compile時會過,執行時會錯@@
錯誤訊息:. . . . . . 發生未處理的例外狀況: 0xC00000FD: Stack overflow
主要原因是因為Stack有大小限制,而且我們一般直接宣告出來的變數是放在Stack,如果在Stack放出大量資料,就會發生Stack overflow,解決方法就是改用new&delete,這樣一來資料就會改成用heap來儲存,也就不會受限於Stack的大小了。只是速度也比較慢,另外要特別注意記得要delete。

// 下面四個for的cup time都介於0.25s左右
for(unsigned int i = 0; i < 100000000; ++i) {
	int sol[20];
}

for(unsigned int i = 0; i < 250000; ++i) {
	int *sol = new int[20];
	delete [] sol;
}

for(unsigned int i = 0; i < 100000000; ++i) {
	Solution sol[20];
}

for(unsigned int i = 0; i < 2500; ++i) {
	Solution *sol = new Solution[20];
	delete [] sol;
}

 
參考資料:堆(heap)和棧(stack)MFC – STACK溢位

Categories: C/C++, 未分類 Tags: , , ,
  1. 目前尚無任何的評論。
  1. 目前尚無任何 trackbacks 和 pingbacks。