Win32上的内存不足(?)问题(与Linux相比)

0 c++ linux winapi bad-alloc

我有以下问题:

在Windows机器上运行的程序(32位,3.1Gb内存,VC++ 2008和mingw编译代码)都会失败并bad_alloc抛出异常(在分配大约1.2Gb之后;在尝试分配900万双倍的向量时抛出异常,即大约75Mb)仍然有足够的RAM(至少根据任务经理).

在Linux机器(32位,4Gb内存; 32位,2Gb内存)上运行的相同程序运行良好,峰值内存使用量约为1.6Gb.有趣的是,由mingw生成的win32代码在wine下的4Gb linux机器上运行也失败了bad_alloc,虽然在不同的(稍后)位置然后在windows下运行时...

有什么可能的问题?

  • 堆积碎片?(我怎么知道?怎么解决这个问题?)
  • 堆腐败?(我运行了启用了pageheap.exe的代码,没有报告错误;实现了带边界检查的矢量访问 - 再次没有错误;代码基本上没有指针,只使用了std::vectors和std::lists.在Valgrind下运行程序( memcheck)消耗太多内存并提前结束,但没有发现任何错误)
  • 内存不足???(应该有足够的内存)

而且,在Linux版本工作时(甚至在内存较少的机器上)Windows版本失败的原因可能是什么?(另请注意,如果可以产生任何影响,/ LARGEADDRESSAWARE链接器标志将与VC + 2008一起使用)

任何想法将非常感激,我在我的智慧结束这... :-(

Nav*_*een 5

它与系统中的RAM数量无关.您的虚拟地址空间不足.对于32位Windows操作系统进程,您将获得4GB的虚拟地址空间(无论您使用多少RAM),用户模式为2GB(LARGEADDRESSAWARE为3GB),内核为2GB.当您尝试使用new分配内存时,OS将尝试查找足够大的虚拟内存的contiguos块以满足内存分配请求.如果您的虚拟地址空间严重碎片或者您要求大量内存,那么它将失败抛出bad_alloc异常.检查您的进程使用的虚拟内存量.