下面的源码文件运行时会提示错误:
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。