申請超大內存時提示 “ Stack Over ” 錯誤(stack over, big memory)

下面的源碼文件運行時會提示錯誤:

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章