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