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