c++ - Operator new 在有大量物理内存可用时抛出异常

标签 c++ exception memory

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

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

最佳答案

物理内存 <> 虚拟内存。

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

即使有 2 GB 的内存,如果没有连续的 130MB 可用 block ,分配 130MB 也可能会失败。自 Windows Vista 以来,DLL 随机分布在地址空间(寻找:ASLR),这(根据我的经验)似乎会导致大量内存碎片。

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

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

如果可能的话,我会选择最后一种选择。

关于c++ - Operator new 在有大量物理内存可用时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10280947/

相关文章:

c++ - 如何增加 vstest.executionengine.x86.exe 的堆栈大小

c++ - 双端队列内存分配可以稀疏吗?

c - 仅使用程序计数器和可执行文件调查未对齐的用户空间访问

c++ - 在 pythonQt 中使用 numpy 模块

c++ - QRegExp 仅解析以特定字符开头的字符串

ruby-on-rails - 在 rails 的初始值设定项中,在哪里为这个文件编写测试用例?

mysql - 物理/内存数据库。 (用于在我的网站上记录目的)

模板类的实例化对象上的 C++ 模板元函数

c++ - 这是 g++ bug、libc bug,还是我疯了(或者也许这三个)?

c++ - 异常指针清理