簡體   English   中英

聲明大數組時堆棧/堆溢出

[英]Stack/heap overflow when declaring a large array

我試圖聲明一個1024 x 1024的float數組,但是剛剛彈出一個窗口,說project_name.exe已停止工作...帶有調試或關閉程序的選項。 以前,我成功聲明了1000 by 2 int數組。 我已經在互聯網上搜索了可能的原因,他們說與內存有關的問題,確切地說是“堆棧/堆溢出”。 他們說,對於浮標情況更糟。

我只需要最多5或6個小數位。

有什么建議或建議嗎? 我在python和matlab中都沒有遇到這個問題。 我正在使用Microsoft Visual Studio 2010。

您是在函數或方法中將其聲明為局部變量嗎? 如果是這樣,這是經典的堆棧溢出。 對於VS2010,請參見http://msdn.microsoft.com/zh-cn/library/8cxs58a6%28v=vs.100%29.aspx

保留值指定虛擬內存中的總堆棧分配。 對於x86和x64機器,默認堆棧大小為1 MB。 在Itanium芯片組上,默認大小為4 MB。

因此,一個1024x1024的float數組(假設每個float包含4個字節)以高達4mb的速度進入-您已經在這里通過了默認的堆棧限制。

請注意,即使您確實擁有Itanium,也將無法使用所有這4mb-例如,參數也需要存儲在堆棧中,請參見http://www.csee.umbc。 edu /〜chang / cs313.s02 / stack.shtml

現在,您可以增加堆棧大小,但是總有一天您將需要使用更大的數組,所以這是一場消耗不了的戰爭。 要解決這個問題,最好先解決它。 換句話說,而不是:

float stuff[1024 * 1024];

您將其聲明為:

float *stuff = new float[1024 * 1024];
// do something interesting and useful with stuff
delete[] stuff;

現在,它不再位於堆棧中,而是分配到堆中。 請注意,這是一樣的堆作為由羅伯特·哈維在他的回答中提到; 您在這里沒有/ HEAP選項的限制。

您是在堆棧上聲明嗎? 這么大的對象必須在堆上!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM