malloc并获得最近释放的内存

时间:2010-05-24 18:50:40

标签: c memory initialization malloc

我正在分配数组并在音频线程的每次回调中释放它。主用户线程(Web浏览器)根据用户输入不断分配和释放内存。我正在将非常规浮动阵列发送到声卡。 (例如,在我的个人资料页面中。)我的想法是听到程序状态的变化。

当我调用malloc(sizeof(float)*256*13)并且更小时,我得到一个充满各种浮点数的数组,这些浮点数看似随机分布。将它随机称为是不对的 - 可能这是来自以前存储块的内容。这是我期望并想要利用的行为。但是当我malloc(sizeof(float)*256*14)更大时,我得到的数组只用零填充。我想知道为什么这个悬崖存在,如果我能做些什么来绕过它。我知道这是标准的未定义行为,但我希望有人知道某些系统上malloc的实现可能有一个解释。

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

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

2 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:1)

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