Stack overflow
最近遇到的一個問題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;
}