我们在Windows 32位系统上运行C ++应用程序。一旦内存使用量达到1.5 GB,它就会崩溃。我们无法理解为什么它以1.5 GB的限制崩溃而不是2 GB的限制(虚拟地址空间和Windows 32位架构限制)?
其他详情: - 可用内存总量:4GB
操作系统:Windows XP
1.5 GB是这一个进程使用的内存。
此致
萨钦
答案 0 :(得分:10)
这在32位Windows下完全正常。
除非您激活了/ 3gb开关,否则总地址空间为2GB。然而,这是减去映射的可执行文件和至少六个DLL和NLS文件(对于“hello world” - 一个真正的应用程序可能更像是十几个或二十几个)。 / p>
由于它们没有最佳放置,因此会损失大约半千兆字节的地址空间。堆不会“进入”该区域,因此分配超过1.5GB将失败。
以下是“典型程序”的地址空间:
请注意一个DLL在大约1/3的地址空间放置非常巧妙,有效地“切断”了可以使用的内存的三分之一。
答案 1 :(得分:4)
虚拟内存碎片可能是一个原因。
另一个可能的原因是内存管理器(内存池)通常如何工作。内存管理器尝试保留一块内存,比前一块多2倍。当内存分配已经相当多时,这个数量将非常大,尽管实际上仍有可用内存,但内存分配将会失败。
答案 2 :(得分:0)
你可以启用博士。 watson作为默认调试器,看看是否可以捕获崩溃转储,然后使用visual studio或windbg打开转储,你可以在崩溃前看到callstack,然后知道崩溃的真正原因是什么。