我有以下问题:
的Windows机器上的程序运行(32位,3.1GB存储器,既VC ++ 2008和MinGW编译的代码)失败, bad_alloc
抛出(大约1.2GB分配后的异常;抛出异常试图分配的900万矢量时双打,75MB左右IE)用大量的内存仍然可用(至少根据任务管理器)。
Linux机器上(32位,4GB内存,32位,2GB内存)运行同一程序运行正常拥有约1.6GB内存使用峰值。 有趣的是下酒4GB的Linux机器上通过mingw的运行所产生的win32代码也失败,bad_alloc的,虽然是在不同的(后)的地方则在Windows下运行...
可能是什么问题?
- 堆不成? (我怎么会知道呢?这又如何解决呢?)
- 堆损坏? (我已经运行的代码没有任何错误启用Pageheap.exe在报道;实施与边界检查---再没有错误向量访问;代码基本上是免费的指针,只
std::vector
S和std::list
s为使用。运行程序下Valgrind的(MEMCHECK)占用太多的内存和过早结束,但没有发现任何错误) - 记不清??? (应该有足够的内存)
此外,可能是什么,虽然Linux版本的工作(甚至在较小的内存的机器)的Windows版本失败的原因吗? (还要注意,/ LARGEADDRESSAWARE链接器标志用于与VC + 2008如果能产生任何影响)
任何想法将不胜感激,我在我无计可施这样结束... :-(
它无关,与多少RAM是在您的系统。 您正在运行了虚拟地址空间。 对于32位Windows操作系统的过程,你会得到一个4GB的虚拟地址空间(不论有多少你使用RAM)从2GB的用户模式(3GB在LARGEADDRESSAWARE的情况下)和2 GB的内核。 当你尝试使用新的分配内存,操作系统将试图找到虚拟内存的contiguos块足够大,以满足内存分配请求。 如果你的虚拟地址空间是非常分散的,或者你要求的内存块巨大那么它将无法抛出一个bad_alloc异常。 检查过程中多少虚拟内存使用。
随着Windows XP x86和默认设置,1.2 GB是所有你已经离开了您的堆地址空间系统库后,你的代码,堆栈和其他的东西拿到自己的份额。 需要注意的是LARGEADDRESSAWARE需要使用/ 3GB引导标志引导到尽量给你的进程到3GB。 将/ 3GB标志导致了很多XP系统的不稳定,这就是为什么它不是默认启用的。
的Windows的x86服务器变种给你更多的地址空间,无论是使用3GB / 1GB拆分,并通过使用PAE允许使用您的RAM 4GB满的。
Linux x86上默认使用3GB / 1GB分裂。
64位操作系统会给你更多的地址空间,即使是32位进程。
你在编译Debug
模式? 如果是这样,分配将产生巨大的调试数据量可能产生你所看到的错误,带正版外的内存。 尝试在Release
,看看是否能解决问题。
我只用VC,MinGW的没有遇到过,但当时我没有检查两种,这还可以解释这个问题。
更详细地说明有关虚拟存储器:当它试图分配一个90MB阵列,并且存在这样可以容纳左虚拟存储器的不连续空间你的应用失败。 也许有些类,通过使用所有数据保存在1MB(左右)叶节点树近似于一个巨大的数组 - 如果您切换到使用较少的内存数据结构,你也许能够得到更远一点。 此外,在C ++做一个巨大的分配量时,它确实帮助,如果所有这些大的分配是相同的尺寸,这有助于重用内存,并保持碎片要低得多。
然而,从长远来看,做正确的事情是简单地切换到64位系统。
文章来源: Out of memory (?) problem on Win32 (vs. Linux)