为什么malloc()分配的内存超过了要求,以及我如何在Mac OS X中禁用malloc



我正在为一个机器人制作一个程序,该程序将迷宫存储为多维动态相邻阵列,由于节点将沿着迷宫遍历被发现,我正在尝试为其分配初始内存,然后在找到新节点后重新分配内存。然而,我曾经意识到,我存储的数据比使用malloc分配的数据还多(我忘记使用realloc),尽管这并没有给我带来某种分割错误或其他错误。所以我很想知道:

  1. 为什么malloc分配的内存比所需的多
  2. 如何禁用此功能以便正确调试程序?我确信机器人不会像我的16GB RAM MacBook那样有大量的堆内存,所以我想知道我的程序是否在程序中分配给它的内存内工作

感谢您的回复!

与大多数人认为的不同,malloc不直接从内核分配内存。相反,它从内核中获取一块内存,然后用数据结构在用户空间中管理该块。该数据结构过去是一个堆,因此称之为"堆内存"。

以上的实际结果是,使用malloc分配的内存周围没有无效内存。事实上,稍微增加内存不会导致程序崩溃。

除上述内容外,malloc本身不会按照您希望的任何大小进行分配。它通常以8、16或32字节的倍数分配块,这取决于用于管理堆的数据结构。当你用malloc分配1个字节时,你实际上得到了大约15个永远不会被任何人使用的字节。重写这些字节不会造成任何明显的不良影响。

如果你想确保你的程序在少量内存下运行,rlimit/ulimit和他的同事是你的朋友。如果你想确保你没有超出你分配的缓冲区,我强烈建议你使用地址消毒剂。使用-fsanitize=address编译(clang和gcc),一旦超出缓冲区,程序就会崩溃。当然,这是以性能为代价的。

我还要补充一点,硬件访问控制只能在页面边界上实现。在英特尔,这是4096字节。即使对于从内核分配的内存,如果访问没有超出分配的页面,那么超过分配结束的访问也不会触发分段错误。

  1. 事实并非如此,你只是运气好而已。你的程序调用了未定义的行为,所以任何事情都可能发生。

  2. 如果您想在受约束的环境中运行程序,以模拟目标机器内存有限的事实,您可以。在启动程序之前,在shell中运行以下命令:ulimit -Sv 1000。它是以千字节为单位的,所以1000意味着1兆字节。

有关ulimit的更多信息,请参阅此处:http://ss64.com/osx/ulimit.html-您也可以在Linux上使用它。

如果您不想每次都运行ulimit,您也可以使用C函数setrlimit()在程序中执行类似的操作。

相关内容

  • 没有找到相关文章

最新更新