据我所知,在win32中,每个程序都会收到4GB的虚拟内存。内存管理器负责将大块内存从物理内存卸载到磁盘。
是否暗示malloc或任何其他内存分配API仅在达到虚拟限制时才会抛出OUT_OF_MEMORY异常?我的意思是,即使程序远离其虚拟大小限制,malloc也可能失败,例如没有物理内存可以卸载到磁盘。假设磁盘具有无限容量,并且没有设置特定限制。
答案 0 :(得分:11)
是的,这是可能的。请记住,内存可能会碎片化,并且malloc
将无法找到足够大的块来满足您请求的大小。在达到4 GiB限制之前,这很容易实现。
答案 1 :(得分:6)
Win 32上的虚拟内存限制为2Gb。在Win 64上,它要大得多。
malloc
不会抛出异常 - 它返回NULL。 NULL返回或异常,如果
页面文件不够大。如果页面文件受策略限制或者没有扩展空间:如果页面文件可用性无法满足内存分配,那么它们将失败。
碎片。底层内存管理器以4Kb块的形式分配内存。它很可能通过分配和解除分配的模式最终得到少量分配的内存,但碎片化的虚拟内存意味着没有足够大的连续区域来满足特定的请求。
答案 2 :(得分:1)
关于Windows虚拟内存的完整章节和经文,请查看Mark Russinovich博客上的这篇文章(这里有很多其他很棒的东西):
Pushing the Limits of Windows: Virtual Memory
如果内存碎片是您的问题并且编写自定义分配器不是您的事情,您可以考虑启用低碎片堆:
Low Fragmentation Heap (Windows)
默认情况下,这些日子开启了。
答案 3 :(得分:0)
如果没有一个较大的区域,如何分配一些较小的区域?