Visual Stdio VS 錯誤 error : 0xC00000FD: Stack overflow. 更改堆棧空間解決棧溢出問題


參考: http://blog.csdn.net/ldanduo/article/details/6659231

 

問題

  1. 給一個程序添加小功能,在debug下能正常運行,在release下就出現內存不能read。
  2. 調試跟蹤找到程序出錯的地方,問題出現在對話框創建的過程中ChannelcfgDlg.Create(IDD_SUB_DLG_CHAN_CFG,&m_settingTab);
  3. 在網上搜索資料,發現程序靜態數據量大的時候,有時會出現棧溢出問題,往往是程序還沒運行算法,就down掉了.
  4. 反觀程序中這個對話框類中確實定義了大量的數組。http://wuliang20080412.blog.163.com/blog/static/905220552010320018881/
  5. 在創建包含大數組的類(或數據)時棧溢出,由於系統分配給程序的棧空間太小。

 

  1. 在VC++.NET中運行聚類程序,老是說Stack OverFlow,  后來才發現是棧空間太小了。 單單保存100個網頁的數據量就比較大了。

 

Visual Stdio Stack 默認設置

  1. LINK的/STACK選項
  2. /STACK   :reserve[,commit]                                缺省         (對應缺省時的)參數
  3. reserve : 棧總大小                                              1M                   0
  4. commit : 程序開始時系統提供的實際內存量             8K                   0

stack setting

 

 

問題解答:

方法一 : 不靜態分配,用new動態創建,從堆中分配的,堆的空間足夠大.

不過記得寫析構函數,delete你申請的堆空間。其實這樣也挺方便,類結束的時候會自動調用析構函數釋放空間。養成"不在棧上定義大數組/大對象"的好習慣很重要,否則再大的棧也會被撐爆的。

當然,如果你不喜歡new,delete的話,還是靜態分配(畢竟靜態分配有很多好處),那么可以通過改變默認棧空間來解決。

方法二 STACKSIZE   定義.def文件
語法:STACKSIZE reserve[,commit]
reserve:棧的大小;commit:可選項,與操作系統有關,在NT上只一次分配物理內存的大小
方法三 設定Visual Stdio 的/STACK 大小
1   VC6.0修改
打開工程,依次操作菜單如下:Project->Setting->Link,在Category 中選中Output,然后
在Reserve中設定堆棧的最大值和commit。
注意:reserve默認值為1MB,最小值為4Byte;commit是保留在虛擬內存的頁文件里面,它設置的較
大會使棧開辟較大的值,可能增加內存的開銷和啟動時間

2 VS2008修改

在 Visual Studio 開發環境中設置此鏈接器Linker選項

· 右鍵打開項目的“屬性頁”對話框。有關詳細信息,請參見設置 Visual C++ 項目屬性

· 單擊“鏈接器Linker”文件夾。

· 單擊“系統 System”屬性頁。

· 修改下列任意一個(都該也可以)屬性:

· 堆棧提交大小Stack Reserve Size 100000000;

· 堆棧保留大小Stack Commit Size  100000000.

stack changing


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM