检测内存不足之前在Windows上分配开始失败

时间:2012-08-12 12:18:17

标签: c++ windows memory-management mfc

我们有一个可能会分配大量小对象的应用程序(取决于用户输入)。有时,应用程序会耗尽内存并导致崩溃。

但是,如果我们知道内存分配变得紧张,那么可以销毁一些优先级较低的对象,从而使我们能够优雅地降低用户结果。

在调用“new”实际上失败之前,检测进程内存的最佳方法是什么?我们可以调用API函数,例如GetProcessWorkingSetSize()GetProcessMemoryInfo(),但是您如何知道何时达到给定计算机的限制(例如,最大分配的80%)?

3 个答案:

答案 0 :(得分:5)

  • 启动时,分配内存储备。
  • 然后使用set_new_handler()安装一个检测分配失败的挂钩。
  • 当有人发生时:
    • 释放预留(因此您有足够的可用内存可供使用)。
    • 运行查找并释放低优先级对象的代码。
    • 当它完成其工作后,尝试再次重新分配保留(下次)。
    • 最后返回让原始分配尝试重试。

答案 1 :(得分:2)

如果是32位进程,那么您需要确保不要使用超过1.6GB,这是2.0GB的80%,这是您的进程允许的最大值。调用GlobalMemoryStatusEx将填充结构MEMORYSTATUSEX.ullAvailVirtual,当这只有400MB可用(或更少)时,您就可以达到阈值。

答案 2 :(得分:0)

检查此答案Win32/MFC: How to find free memory (RAM) available?

您需要定期查找可用的可用内存并在某个限制内停止分配。 如上面提到的答案中所述,您可以使用GlobalMemoryStatusEx和/或VirtualQueryEx