2016-11-23 373 views
1

我編寫了一個C++程序,它在編譯爲64位可執行文件時在Linux上正常工作。我還編它作爲Windows 32位可執行文件,並將它與下面的消息崩潰:32位/ 64位Windows/Linux應用程序

boost\boost_1_55_0\boost/test/minimal.hpp(123): exception "std::bad_alloc: bad allocation" caught in function: 'int __cdecl main(int,char *[])' 

正如我必須分配大小20000 * 20000的整數矩陣,我告訴自己,我大概超過在32位平臺上允許的大小...

所以我編譯它爲64位Windows可執行文件,它工作正常。爲了檢查我的假設是否正確,我決定將它編譯爲32位Linux可執行文件,並且它也可以正常工作?所以,我不知道什麼飛機墜毀的原因可能是......

  • 32位Windows =>碰撞標準bad_alloc的
  • 64位Windows =>運行正常
  • 32位Linux的=>運行正常
  • 64位Linux =>運行正常
+4

無法重現該問題。請與我們分享[mcve]。請注意,我們不需要完整的代碼,我們需要製造[mcve]。 –

回答

6

32位Windows爲您提供了不到2GB的地址空間,各種DLL文件,程序,堆棧和任何其他的內存,你」已經分配在各處散佈。這有時意味着它在一個連續的塊中沒有1.5GB的空間給你。

它在32位的Linux中工作,因爲我相信實際上爲您提供了3GB的地址空間。否則,它也遭受同樣的問題。

+0

他肯定會按照您描述的方式觸及2GB的進程限制。但只是好奇,用虛擬內存,「連續塊」實際上很重要?即使代碼成功分配了整個1.5GB塊,它也會分配到不同的RAM和虛擬內存頁面。 (或者我錯過了什麼?) – selbie

+0

@selbie它需要一個連續的虛擬地址空間塊,如何映射是不相關的。 –

+0

@DanMašek - 這很有道理。 – selbie

相關問題