我有以下问题:
在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下运行时...
有什么可能的问题?
std::vectors和std::lists.在Valgrind下运行程序( memcheck)消耗太多内存并提前结束,但没有发现任何错误)而且,在Linux版本工作时(甚至在内存较少的机器上)Windows版本失败的原因可能是什么?(另请注意,如果可以产生任何影响,/ LARGEADDRESSAWARE链接器标志将与VC + 2008一起使用)
任何想法将非常感激,我在我的智慧结束这... :-(
它与系统中的RAM数量无关.您的虚拟地址空间不足.对于32位Windows操作系统进程,您将获得4GB的虚拟地址空间(无论您使用多少RAM),用户模式为2GB(LARGEADDRESSAWARE为3GB),内核为2GB.当您尝试使用new分配内存时,OS将尝试查找足够大的虚拟内存的contiguos块以满足内存分配请求.如果您的虚拟地址空间严重碎片或者您要求大量内存,那么它将失败抛出bad_alloc异常.检查您的进程使用的虚拟内存量.