gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:05:19 24 4
gpt4 key购买 nike

在我的程序中,我使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com