gpt4 book ai didi

c - malloc 和获取最近释放的内存

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:58 26 4
gpt4 key购买 nike

我正在分配数组并在音频线程的每个回调中释放它。主用户线程(Web 浏览器)根据用户输入不断分配和释放内存。我正在将未初始化的 float 组发送到声卡。 (我的个人资料页面中的示例。)这个想法是听到程序状态的变化。

当我调用 malloc(sizeof(float)*256*13) 时,我得到一个数组,里面装满了看似随机分布的各种 float 。称其为随机是不正确的——大概这来自于先前持有的任何内存块。这是我预期并想要利用的行为。但是,当我执行 malloc(sizeof(float)*256*14) 和更大的操作时,我得到一个仅填充零的数组。我想知道为什么存在这个悬崖,以及我是否可以做些什么来绕过它。我知道根据标准这是未定义的行为,但我希望知道 malloc 在某些系统上的实现的人可能会有解释。

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

我想这对某些人来说是个奇怪的问题,因为我的目标是探索未定义的行为并故意使用不良的编程实践,但这是我感兴趣的应用程序,所以请忍受未定义数组的使用。我知道这种用法的行为是未定义的,所以请耐心等待,不要告诉我不要这样做。我正在 mac 10.5 上开发。

最佳答案

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

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

关于c - malloc 和获取最近释放的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2899422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com