[英]Why is malloc() allocating more memory than demanded and how can I disable malloc from doing this in Mac OS X?
我正在为一个机器人程序编写一个程序,该程序将迷宫存储为多维动态邻接数组,并且由于将沿着迷宫遍历发现节点,因此我尝试为其分配初始内存,然后在重新分配新节点后重新分配内存被发现。 但是,我曾经意识到我存储的数据要比使用malloc
分配的数据多(我忘记使用realloc
),尽管它没有给我带来某种分段错误或其他错误。 所以我很想知道:
感谢您的答复!
与大多数人的想法不同,malloc不会直接从内核分配内存。 取而代之的是,它从内核获取一块内存,然后使用数据结构在用户空间中管理该内存块。 该数据结构曾经是一个堆,因此将其称为“堆内存”。
上面的实际结果是,使用malloc分配的内存周围没有无效的内存。 实际上,将内存稍微增加一点不会导致程序崩溃。
除上述内容外,malloc本身不会以您希望的任何大小进行分配。 它通常以8、16或32字节的倍数分配块,具体取决于用于管理堆的数据结构。 当您使用malloc分配1个字节时,实际上得到了大约15个字节,任何人都不会使用。 覆盖这些字节不会引起任何明显的不良影响。
如果要确保程序使用少量内存,rlimit / ulimit和co是您的朋友。 如果要确保不超出分配的缓冲区,我强烈建议使用地址清理器。 使用-fsanitize=address
编译(clang和gcc),一旦您超出缓冲区,程序将崩溃。 当然,这是以性能为代价的。
我还要补充说,仅在页面边界上才可以进行硬件访问控制。 在Intel上,为4096字节。 即使对于从内核分配的内存,如果分配结束后的访问未移出分配的页面,它们也不会触发分段错误。
不,您只是幸运。 您的程序调用了未定义的行为,因此任何事情都可能发生。
如果要在受限环境中运行程序,可以模拟目标计算机内存有限的事实。 在启动程序之前,请在外壳程序中运行以下命令: ulimit -Sv 1000
。 它以千字节为单位,因此1000表示1兆字节。
有关ulimit的更多信息,请参见此处: http : //ss64.com/osx/ulimit.html-您也可以在Linux上使用它。
如果您不想每次都运行ulimit
,也可以使用C函数setrlimit()
在程序中执行类似的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.