Bor*_*ris 3 c c++ winapi memory-management
据我所知,在win32中,每个程序都会收到4GB的虚拟内存.内存管理器负责将大块内存从物理内存卸载到磁盘.
是否暗示malloc或任何其他内存分配API仅在达到虚拟限制时才会抛出OUT_OF_MEMORY异常?我的意思是,即使程序远离其虚拟大小限制,malloc也可能失败,例如,物理内存都不能卸载到磁盘.假设磁盘具有无限容量,并且没有设置特定限制.
Joe*_*oey 12
是的,这是可能的.请记住,内存可能会碎片化,并且malloc无法找到足够大的块来满足您请求的大小.在达到4 GiB限制之前,这很容易实现.
Win 32的虚拟内存限制为2Gb.在Win 64上,它要大得多.
malloc不会抛出异常 - 它返回NULL.NULL返回或异常,如果达到2Gb限制,内存管理器可能会很快失败
分页文件不够大.如果页面文件受策略限制或缺乏扩展空间:如果页面文件可用性无法满足内存分配,则它们将失败.
碎片.底层内存管理器以4Kb块的形式分配内存.它很可能通过分配和解除分配的模式最终得到少量分配的内存,但碎片化的虚拟内存意味着没有足够大的连续区域来满足特定请求.