当大量物理内存可用时,operator new会抛出异常

时间:2012-04-23 12:53:00

标签: c++ exception memory

在我的程序中,我使用operator new来分配大约130兆字节和异常 抛出,但我发现任务管理器中有超过800兆字节可用。 我希望知道物理内存之间的关系 任务管理器和我的程序可以使用的内存。

另一个原因是内存碎片化。当我请求内存分配时,内存是 需要作为连续的。有没有办法知道这种连续的记忆是否存在?

2 个答案:

答案 0 :(得分:4)

物理内存<>虚拟内存。

如果您运行的是32位应用程序,则最多可以处理2 GB内存(在32位操作系统上)。即使您的计算机具有32 GB的物理内存,您仍然限制为2 GB。 如果您的机器具有最小量的物理内存(还记得我们都拥有128 MB物理内存的日子吗?),或者您正在运行许多其他应用程序,那么大小可能小于2 GB(整个页面文件必须在所有申请之间分配。)

即使有2 GB的内存,如果没有130 MB的连续块,则130 MB的分配可能会失败。从Windows Vista开始,DLL会在地址空间上随机传播(查找:ASLR),这(根据我的经验)似乎会导致大量内存碎片。

您的问题有几种解决方案:

  • 如果您可以控制正在运行的系统,则可以为系统禁用ASLR。如果您正在销售商业软件,请不要这样做。您的客户不会接受此。
  • 如果您的32位应用程序在64位系统上运行,请为应用程序提供/ LARGEADDRESSAWARE标志(请参阅链接器标志或editbin实用程序)。使用此标志,您的应用程序应该能够处理4 GB而不是2 GB。只有在你确定你没有用指针做“脏”的事情时才这样做(例如减去不相关的指针)。
  • 分配较小的内存而不是一个大块。抽象你需要一个大块的事实(例如通过围绕这个大块写一个类)。

如果可能的话,我会选择最后的替代方案。

答案 1 :(得分:0)

我假设你在Windows上。可用的RAM量与new是否可以分配内存无关。它取决于进程的虚拟内存中是否有130 MB的连续虚拟内存块。将RAM视为操作系统可以非常快速地写入和读取的有限暂存区。但是如果它在寻找的任何东西都没有在刮擦中可用,它将转到磁盘并将其写入便笺簿。