Mic*_*nen 1 c memory malloc initialization
我正在分配数组并释放音频线程的每次回调.主用户线程(Web浏览器)根据用户输入不断分配和释放内存.我正在将非常规浮动阵列发送到声卡.(在我的个人资料的页面中示例.)我们的想法是听到程序状态的变化.
当我打电话给malloc(sizeof(float)*256*13)小号时,我会得到一个充满各种浮子的阵列,这些浮子看似随意分布.将它随机称为是不对的 - 可能这是来自以前存储块的内容.这是我期望并想要利用的行为.然而,当我做malloc(sizeof(float)*256*14)更大的时候,我得到的数组只用零填充.我想知道为什么这个悬崖存在,如果我能做些什么来绕过它.我知道这是标准的未定义行为,但我希望有人知道某些系统上malloc的实现可能有一个解释.
这是否意味着malloc还会将较大尺寸的块设置为零?这将是令人惊讶的,因为它不会有效.即使有更多的内存被清零,我也会发现有时会发生一些事情,因为阵列不断变化.
如果可能的话,我希望能够获得在最近释放的内存上重新分配的内存块,因此任何替代方案都会受到欢迎.
我想这是一个奇怪的问题,因为我的目标是探索未定义的行为并故意使用错误的编程实践,但这是我感兴趣的应用程序,所以请忍受uninited数组的使用.我知道这种用法的行为是不明确的,所以请耐心等待,不要告诉我不要这样做.我正在使用mac 10.5进行开发.
最有可能的是,较大的分配导致堆管理器直接从内核请求虚拟地址空间的页面.释放将该地址空间返回给内核.内核必须将为进程分配的所有页面归零 - 这是为了防止数据从一个进程泄漏到另一个进程.
较小的分配由进程内的用户模式堆管理器处理,方法是从内核获取更大的页面分配,将它们分成更小的块,并在后续分配中重用块.这些不需要进行零初始化,因为内存内容总是来自您自己的进程.