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

时间:2011-04-16 06:11:50

标签: c++ windows

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

其他详情: - 可用内存总量:4GB

操作系统:Windows XP

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

此致

萨钦

3 个答案:

答案 0 :(得分:10)

这在32位Windows下完全正常。

除非您激活了/ 3gb开关,否则总地址空间为2GB。然而,这是减去映射的可执行文件和至少六个DLL和NLS文件(对于“hello world” - 一个真正的应用程序可能更像是十几个或二十几个)。 / p>

由于它们没有最佳放置,因此会损失大约半千兆字节的地址空间。堆不会“进入”该区域,因此分配超过1.5GB将失败。

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

enter image description here

请注意一个DLL在大约1/3的地址空间放置非常巧妙,有效地“切断”了可以使用的内存的三分之一。

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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