一旦它的内存使用量达到1.5 GB,C ++应用程序崩溃

我们有一个运行在Windows 32位系统上的C ++应用程序。 一旦内存使用量达到1.5 GB,就会崩溃。 我们无法理解的是,为什么它会在1.5 GB的限制下崩溃,而不是在2 GB的限制(虚拟地址空间和Windows 32位体系结构限制)?

其他细节: – 可用内存总量:4GB

操作系统:Windows XP

1.5 GB是这一个进程使用的内存。

问候,

萨钦

这在32位Windows下是完全正常的。

除非您激活了/ 3gb开关,否则您的总地址空间为2GB。 但是,这是减去映射的可执行文件,至少有六个DLL和NLS文件(“hello world” – 一个真正的应用程序可能会有更多的十二二十个)。

由于它们不是最佳放置位置,因此您将失去大约半个千兆字节的地址空间。 堆不会成长为“进入”该地区,因此分配超过1.5GB将失败。

以下是“典型程序”的地址空间:

在这里输入图像说明

请注意,一个DLL如何巧妙地置于地址空间的1/3左右,从而有效地“切断”了可以使用的三分之一的内存。

虚拟内存的碎片可能是一个原因。

另一个可能的原因是内存管理器(内存池)通常是如何工作的。 内存管理器尝试保留比前一次更多的内存块。 当内存分配已经相当多的时候,这个数量将会非常大,尽管实际上仍然有可用的内存,但内存分配将会失败。

你可以启用博士。 watson作为默认的调试器,然后查看是否可以抓取崩溃转储,然后用visual studio或windbg打开转储,然后在崩溃之前可以看到调用堆栈,然后知道崩溃的真正原因是什么。