繁体   English   中英

为什么malloc()分配的内存比要求的多,并且如何在Mac OS X中禁用malloc?

[英]Why is malloc() allocating more memory than demanded and how can I disable malloc from doing this in Mac OS X?

我正在为一个机器人程序编写一个程序,该程序将迷宫存储为多维动态邻接数组,并且由于将沿着迷宫遍历发现节点,因此我尝试为其分配初始内存,然后在重新分配新节点后重新分配内存被发现。 但是,我曾经意识到我存储的数据要比使用malloc分配的数据多(我忘记使用realloc ),尽管它没有给我带来某种分段错误或其他错误。 所以我很想知道:

  1. 为什么malloc分配的内存超出了要求?
  2. 如何禁用此功能,以便可以正确调试程序? 我确定该机器人不会像我的16GB RAM MacBook那样拥有堆内存,因此我想知道我的程序是否在程序中分配给它的内存中工作。

感谢您的答复!

与大多数人的想法不同,malloc不会直接从内核分配内存。 取而代之的是,它从内核获取一块内存,然后使用数据结构在用户空间中管理该内存块。 该数据结构曾经是一个堆,因此将其称为“堆内存”。

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

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

如果要确保程序使用少量内存,rlimit / ulimit和co是您的朋友。 如果要确保不超出分配的缓冲区,我强烈建议使用地址清理器。 使用-fsanitize=address编译(clang和gcc),一旦您超出缓冲区,程序将崩溃。 当然,这是以性能为代价的。

我还要补充说,仅在页面边界上才可以进行硬件访问控制。 在Intel上,为4096字节。 即使对于从内核分配的内存,如果分配结束后的访问未移出分配的页面,它们也不会触发分段错误。

  1. 不,您只是幸运。 您的程序调用了未定义的行为,因此任何事情都可能发生。

  2. 如果要在受限环境中运行程序,可以模拟目标计算机内存有限的事实。 在启动程序之前,请在外壳程序中运行以下命令: ulimit -Sv 1000 它以千字节为单位,因此1000表示1兆字节。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM