我有以下問題(?):超出內存在Win32(與Linux)的問題
在Windows機器上的程序運行(32位,3.1GB的內存,無論是VC++ 2008和MinGW編譯代碼)失敗,拋出一個bad_alloc
異常(在分配大約1.2Gb後;嘗試分配一個900萬雙打的矢量,即大約75Mb的矢量時拋出異常),並有大量RAM仍然可用(至少根據任務管理器)。
在Linux機器上運行的相同程序(32位,4Gb內存; 32位,2Gb內存)運行良好,峯值內存使用量約爲1.6Gb。有趣的是,由mingw運行在wine下的4Gb linux機器上的win32代碼在bad_alloc下也失敗,儘管在不同的(稍後)地方,然後當在windows下運行時...
有什麼可能的問題?
- 堆碎片? (我怎麼知道?這怎麼解決?)
- 堆腐敗? (我已經啓用了pageheap.exe的代碼,沒有報告錯誤;實現了帶邊界檢查的向量訪問---再次沒有錯誤;代碼本質上沒有指針,只使用
std::vector
s和std::list
s。在Valgrind(memcheck)下消耗太多內存並提前結束,但沒有發現任何錯誤) - 內存不足? (應該有足夠的內存)
此外,可能是什麼,雖然 Linux版本的工作(甚至在較小的內存的機器)的Windows版本失敗的原因嗎? (另請注意, /LARGEADDRESSAWARE鏈接器標誌使用VC + 2008年如果能夠有任何影響)
任何想法,將不勝感激,我在我無計可施這樣結束...... :-(
我注意到我實際上在不斷調整可能導致碎片的矢量大小。試圖解決這個問題,但它似乎沒有預期的效果,但我可能錯過了一些東西。當然有些東西需要調查(即sysinternals輸出)。當我知道更多的時候會回來...... –
事實證明,堆碎片是罪魁禍首。我能夠消除大部分的矢量調整大小。然而,問題仍然存在,因爲構建一個大型的(大約900萬行)std :: list向量會立即導致程序失效。我想我必須爲列表實現一個自定義分配器(我對此不太瞭解),或者將列表的實現切換爲固定大小的數組(我的列表很小,所以我不會因此釋放太多內存) 。有趣的是,當用mingw編譯時,該程序現在可以適應2GB的容量,而VC不能。 –