代码之家  ›  专栏  ›  技术社区  ›  Buzz

为什么malloc总是返回空值

  •  6
  • Buzz  · 技术社区  · 16 年前

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

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

    我认为使用malloc来分配88个字节是可以的,因为进程内存的使用量只有800MB。但是malloc总是返回空值。

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

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

    3 回复  |  直到 16 年前
        1
  •  2
  •   0xC0DEFACE    16 年前

    你提到了记忆碎片,这当然是我的第一个猜测。尝试下载 this 应用程序。它叫 地址空间监视器 如果是碎片问题,应该能够向您显示。

        2
  •  2
  •   MSN    16 年前

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

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

        3
  •  0
  •   Bob Lied    16 年前

    另一种可能性是程序中可能有一个bug。您认为您请求的是88个字节,但可能传递的是一个未初始化的变量,请求的是数百兆字节。或者,您之前所做的操作可能会导致缓冲区溢出并损坏堆,从而导致malloc()在此之后失败。