代码之家  ›  专栏  ›  技术社区  ›  Michael Chinen

malloc和获取最近释放的内存

  •  1
  • Michael Chinen  · 技术社区  · 15 年前

    我正在分配数组并释放音频线程的每个回调。主用户线程(Web浏览器)不断地根据用户输入分配和释放内存。我正在将不符合条件的浮点数组发送到声卡。(我的页面上的例子来自我的配置文件。)我的想法是听到程序状态的变化。

    当我呼唤 malloc(sizeof(float)*256*13) 小一些,我得到一个数组,里面充满了大量的浮动,它们看起来是随机分布的。把它称为随机的是不正确的——这可能来自于先前保存的内存块。这是我期望和想要利用的行为。但是当我这样做的时候 malloc(sizeof(float)*256*14) 更大的是,我得到了一个只有0的数组。我想知道这个悬崖为什么会存在,如果有什么我可以做的来绕过它。我知道这是标准中未定义的行为,但我希望了解malloc在某些系统上的实现的人能够给出解释。

    这是否意味着malloc也在memsetting块为零的大尺寸?这将是令人惊讶的,因为它不会是有效的。即使有更多的内存块被清空,我也希望有时会发生一些事情,因为数组不断变化。
    如果可能的话,我希望能够获得在最近释放的内存上重新分配的内存块,因此欢迎任何替代方法。

    我想这对某些人来说是个奇怪的问题,因为我的目标是探索未定义的行为并有意使用糟糕的编程实践,但这是我感兴趣的应用程序,因此请注意使用未组合的数组。我知道这种用法的行为是不明确的,所以请你容忍我,不要告诉我不要这样做。我正在Mac 10.5上开发。

    2 回复  |  直到 10 年前
        1
  •  9
  •   Michael    15 年前

    最有可能的是,较大的分配会导致堆管理器直接从内核请求虚拟地址空间的页面。释放将把地址空间返回到内核。内核必须将为进程分配的所有页面归零—这是为了防止数据从一个进程泄漏到另一个进程。

    较小的分配由进程内的用户模式堆管理器处理,方法是从内核获取这些较大的页面分配,将它们分割成较小的块,并在随后的分配中重用块。这些不需要初始化为零,因为内存内容总是来自您自己的进程。

        2
  •  1
  •   Puppy    15 年前

    您可能会发现,以前的请求可以使用连接在一起的较小的块来填充。但是,当您请求更大的内存时,现有的空闲内存可能无法处理那么多,并且会直接从操作系统翻转一些内置的开关来请求。