在我的程序中,我使用 operator new 分配大约 130 兆字节并引发异常,但我发现任务管理器中有超过 800 兆字节可用。我希望知道任务管理器中指示为可用的物理内存与我的程序可以使用的内存之间的关系。
另一个原因是内存碎片。当我请求内存分配时,内存需要是连续的。有没有办法知道这种连续的记忆是否存在?
物理内存<>虚拟内存。
如果您正在运行 32 位应用程序,则最多可以寻址 2 GB 内存(在 32 位操作系统上)。即使您的机器有 32 GB 的物理内存,您仍然被限制为 2 GB。如果您的计算机具有最小的物理内存(还记得我们都有 128 MB 物理内存的日子吗?),或者您正在运行许多其他应用程序,那么大小可以小于 2 GB(整个页面文件必须在所有应用程序之间进行划分)。
即使有 2 GB 内存,如果没有可用的 130MB 连续块,分配 130MB 也可能会失败。自 Windows Vista 以来,DLL 随机分布在地址空间中(查找:ASLR),这(根据我的经验)似乎会导致大量内存碎片。
您的问题有几种解决方案:
如果可能的话,我会选择最后一个选择。
我假设你在 Windows 上。可用的 RAM 量与 new 是否可以分配内存无关。这取决于您的进程的虚拟内存中是否有 130 MB 的连续虚拟内存块可用。将 RAM 视为有限的暂存器,操作系统可以在其中快速写入和读取。但是,如果它正在寻找的任何东西在暂存器中不可用,它将转到磁盘并将其写入暂存器。