下面的源碼文件運行時會提示錯誤:函數
struct ShareMemoryMessage { int id; char data[50 * 1024 * 1024]; }; int main() { ShareMemoryMessage msg = { 0 }; getchar(); return 0; }
提示堆棧內存溢出!線程
這是由於默認的堆棧內存只有1M,而定義的ShareMemoryMessage結構體使用了大於50M的內存,顯然已經遠遠超出了默認的堆棧內存。解決的方法有三個:code
一、將結構體定義到main()函數以外,好比全局變量:內存
struct ShareMemoryMessage { int id; char data[50 * 1024 * 1024]; }; ShareMemoryMessage msg = { 0 }; int main() { memset(&msg, 0, 1024); getchar(); return 0; }
這樣一來該內存就會在main()函數以前在靜態內存區域申請,而不會在堆棧中申請,1M的堆棧內存限制大小對它就不起做用啦!get
二、將結構體由申請堆棧內存改成申請動態內存:源碼
struct ShareMemoryMessage { int id; char data[50 * 1024 * 1024]; }; int main() { ShareMemoryMessage* msg = new ShareMemoryMessage; memset(msg, 0, 1024); getchar(); return 0; }
這樣的話結構體會申請動態堆內存,而不會在main()函數所在的主線程去申請堆棧內存!class
三、修改程序默認的堆棧大小:變量
以上是VS2015項目屬性上設置堆棧內存的位置,須要注意的是,若是結構體須要的是50M的內存,堆棧內存必需要比這個值大至少1M左右,上圖實際設置的堆棧內存爲60M。程序