2013-07-11 93 views
1

我試圖聲明一個由1024浮點數組成的1024,但是一個窗口剛剛彈出來,說project_name.exe已經停止工作......選項是否調試或關閉程序。以前,我成功地用2個int數組聲明瞭1000。我在網上搜索可能的原因,他們說與內存有關的問題,「堆棧/堆溢出」的確切內容。他們說這對於浮動的情況更糟糕。當聲明一個大型數組時,堆棧/堆溢出

我只需要5或6位小數。

任何建議或建議?我沒有在python和matlab中遇到過這個問題。我正在使用Microsoft Visual Studio 2010.

+1

如果您無法在實際代碼的前面對其進行故障排除,您的整個工作環境可供您使用,那麼我們希望有什麼希望能夠在沒有工具和不可見的情況下找出答案?它*是一個與內存相關的問題;你將不得不做一些調試並找出原因。 –

+0

如果您的二維數組不需要連續,請嘗試製作1024個獨立的1024個大小的浮點數組分配。 –

回答

11

你是否聲明這是一個函數或方法中的局部變量?如果是的話,這是一個典型的堆棧溢出。對於VS2010,請參見http://msdn.microsoft.com/en-us/library/8cxs58a6%28v=vs.100%29.aspx

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

所以一個掛載數組的浮點數(假設每個浮點數爲4個字節)的時鐘速度高達4MB - 您已經在這裏通過了默認棧限制。

請注意,即使你有一個安騰你不會要能夠使用所有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; 

而不是被這個現在將在堆上分配在棧上。請注意,這是而不是與Robert Harvey在他的回答中提到的堆一樣;您在這裏沒有/ HEAP選項的限制。

+3

或者只是使用一個矢量,它會爲你做所有這些,'vector >'將在堆上分配它的數據,然後用RAII – jozefg

+0

@jozefg自動釋放它 - 非常正確。 – 2013-07-11 19:32:18

+0

但是,請注意,這同樣適用於C程序(除了使用malloc/free而不是new/delete),所以通過不使用向量來回答更通用。 – 2013-07-11 19:42:16

2

您是否在堆棧中聲明瞭它?大的物件必須放在堆上!