參考: http://blog.csdn.net/ldanduo/article/details/6659231
問題
- 給一個程序添加小功能,在debug下能正常運行,在release下就出現內存不能read。
- 調試跟蹤找到程序出錯的地方,問題出現在對話框創建的過程中ChannelcfgDlg.Create(IDD_SUB_DLG_CHAN_CFG,&m_settingTab);
- 在網上搜索資料,發現程序靜態數據量大的時候,有時會出現棧溢出問題,往往是程序還沒運行算法,就down掉了.
- 反觀程序中這個對話框類中確實定義了大量的數組。http://wuliang20080412.blog.163.com/blog/static/905220552010320018881/
- 在創建包含大數組的類(或數據)時棧溢出,由於系統分配給程序的棧空間太小。
- 在VC++.NET中運行聚類程序,老是說Stack OverFlow, 后來才發現是棧空間太小了。 單單保存100個網頁的數據量就比較大了。
Visual Stdio Stack 默認設置
- LINK的/STACK選項
- /STACK :reserve[,commit] 缺省 (對應缺省時的)參數
- reserve : 棧總大小 1M 0
- commit : 程序開始時系統提供的實際內存量 8K 0
問題解答:
方法一 : 不靜態分配,用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.