2011-03-24 43 views
2

我有一点问题:C++程序崩溃时的“免费”存储器是零,但待机存储器仍然可用

我需要围绕数据的260MB加载到一个结构(用fread)。的Windows资源管理告诉我,我有:在使用

  • 2346mb内存
  • 待机
  • 248MB内存
  • 1478mb内存免费

然而,当我运行我的程序并加载数据该程序在没有剩余“空闲”内存的情况下崩溃。还有大约1200MB的待机内存。

我想,当空闲内存为空时,它会自动将待机内存交换到磁盘并释放更多内存?

有什么办法可以避免这个问题,或者我做错了什么?

+0

它是32位程序吗?如果是这样,无论您拥有多少物理内存或交换空间,您最多只能获得2-3 GB的虚拟地址空间。 – 2011-03-24 02:58:59

+0

你可以更新一些你分配内存的代码吗? Windows资源管理中的内存使用情况对于您的情况并不重要,因为所有Windows 32位进程都有自己的4GB虚拟内存空间(尽管系统预留1〜2GB)。 – young 2011-03-24 02:59:53

回答

5

仅仅因为内存可用并不意味着它是连续的。当你要求这样一个大块时,你不可能得到它,因为可用内存是分散的。

+0

这是有道理的。应该想到这一点。谢谢 – clasnes 2011-03-24 03:00:50

+0

连续内存仅对DMA缓冲区很重要。连续的地址空间,另一方面... – 2011-03-24 03:04:52

1

您正在耗尽虚拟地址空间,而不是物理内存。正如你猜测的那样,物理内存将会增加,缩小磁盘缓存,然后通过使用交换文件。然而,虚拟地址空间是一个硬限制。

+0

downvote的原因是什么? – 2011-03-24 03:28:47

0
  1. 尝试从系统属性更改虚拟内存页面文件大小。
  2. 在程序开始时分配所有需要的内存。 (内存池概念)
  3. 重新启动系统并重试