我的开发环境是VS2008,DX9,Windows XP。 我尝试在内存不足的情况下添加保护处理。 当malloc返回NULL时,我会将一些资源写入磁盘,并释放内存中的资源。
但有时,malloc总是返回NULL,即使我释放了大部分资源和进程内存使用量,并且任务管理器中的VM大小只有800MB。
我认为使用malloc分配88个字节应该没问题,其中进程内存使用量仅为800MB。但malloc总是返回NULL。
这可能是内存碎片吗?它看起来不像那样,因为进程内存使用量不是太多。
答案 0 :(得分:2)
你提到了内存碎片,这肯定是我的第一个猜测。尝试下载this应用程序。它被称为地址空间监视器,应该能够显示它是否存在碎片问题。
答案 1 :(得分:2)
可能是虚拟地址空间碎片。一种检查方法是致电HeapCompact(GetProcessHeap(), 0)
。如果这释放了足够的内存,那么这就是可能的原因。
另一个类似的原因是从调试器启动;导致Windows使用调试堆,调试堆在很长一段时间内确实存在非常糟糕的内存行为。要禁用该行为,请在环境中设置_NO_DEBUG_HEAP=1
并运行。
答案 2 :(得分:0)
另一种可能性是程序中可能存在错误。你认为你要求88字节,但也许你传递一个未初始化的变量并要求数百兆字节。或者也许你之前做过的事情超过了缓冲区并破坏了堆,导致malloc()在此之后永远失败。