为什么malloc总是返回NULL

时间:2010-03-02 06:13:04

标签: c++ c windows directx memory-management

我的开发环境是VS2008,DX9,Windows XP。 我尝试在内存不足的情况下添加保护处理。 当malloc返回NULL时,我会将一些资源写入磁盘,并释放内存中的资源。

但有时,malloc总是返回NULL,即使我释放了大部分资源和进程内存使用量,并且任务管理器中的VM大小只有800MB。

我认为使用malloc分配88个字节应该没问题,其中进程内存使用量仅为800MB。但malloc总是返回NULL。

这可能是内存碎片吗?它看起来不像那样,因为进程内存使用量不是太多。

alt text http://i.imagehost.org/0267/Snap2.jpg

3 个答案:

答案 0 :(得分:2)

你提到了内存碎片,这肯定是我的第一个猜测。尝试下载this应用程序。它被称为地址空间监视器,应该能够显示它是否存在碎片问题。

答案 1 :(得分:2)

可能是虚拟地址空间碎片。一种检查方法是致电HeapCompact(GetProcessHeap(), 0)。如果这释放了足够的内存,那么这就是可能的原因。

另一个类似的原因是从调试器启动;导致Windows使用调试堆,调试堆在很长一段时间内确实存在非常糟糕的内存行为。要禁用该行为,请在环境中设置_NO_DEBUG_HEAP=1并运行。

答案 2 :(得分:0)

另一种可能性是程序中可能存在错误。你认为你要求88字节,但也许你传递一个未初始化的变量并要求数百兆字节。或者也许你之前做过的事情超过了缓冲区并破坏了堆,导致malloc()在此之后永远失败。