我正在为一个机器人程序编写一个程序,该程序将迷宫存储为多维动态邻接数组,并且由于将沿着迷宫遍历发现节点,因此我尝试为其分配初始内存,然后在分配新节点后重新分配内存被发现。但是,我曾经意识到我存储的数据比我分配的数据要多malloc
(我忘记使用realloc
),尽管它没有给我带来某种分段错误或其他错误。所以我很想知道:
谢谢您的答复!
与大多数人的想法不同,malloc不会直接从内核分配内存。取而代之的是,它从内核中获取了一块内存,然后使用数据结构在用户空间中管理该内存块。该数据结构曾经是一个堆,因此将其称为“堆内存”。
上面的实际结果是,使用malloc分配的内存周围没有无效的内存。实际上,将内存稍微增加一点不会导致程序崩溃。
除上述内容外,malloc本身不会以您希望的任何大小进行分配。它通常以8、16或32字节的倍数分配块,具体取决于用于管理堆的数据结构。当您使用malloc分配1个字节时,实际上得到了大约15个字节,任何人都不会使用。覆盖这些字节不会引起任何明显的不良影响。
如果要确保程序使用少量内存,rlimit / ulimit和co是您的朋友。如果要确保不超出分配的缓冲区,我强烈建议使用地址清理器。使用编译(clang和gcc)-fsanitize=address
,一旦您超出缓冲区,您的程序就会崩溃。当然,这是以性能为代价的。
我还要补充说,仅在页面边界上才可以进行硬件访问控制。在Intel上,这是4096个字节。即使对于从内核分配的内存,超过分配末尾的访问也不会触发分段错误(如果它们不移出分配的页面)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句