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

丹麦A.Alvi

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

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

谢谢您的答复!

沙迦·谢麦什(Shachar Shemesh)

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

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

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

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

我还要补充说,仅在页面边界上才可以进行硬件访问控制。在Intel上,这是4096个字节。即使对于从内核分配的内存,超过分配末尾的访问也不会触发分段错误(如果它们不移出分配的页面)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何禁用在Mac OS X中悬停的文字语音?

来自分类Dev

如何在C ++中禁用OS X App Nap?

来自分类Dev

Mac OS X 10.10禁用USB端口

来自分类Dev

如何在Mac OS X的NSViewController中禁用标题栏的关闭,最小化和缩放按钮

来自分类Dev

强制free()将malloc内存返回给OS

来自分类Dev

Mac OS X-在启动时禁用未在“帐户”的“登录项”中列出的程序

来自分类Dev

禁用Mac OS 10.9 Mavericks中的压缩内存?

来自分类Dev

OS X上的GCC分配的内存比预期的多

来自分类Dev

为什么要在运行malloc代码之前分配内存?

来自分类Dev

为什么malloc根本不分配内存?

来自分类Dev

为什么malloc消耗那么多内存?

来自分类Dev

如何在Mac OS X 10.11 El Capitan上禁用Vsync

来自分类Dev

如何在Mac OS X上禁用自动DivX更新弹出窗口

来自分类Dev

如何在Mac OS X中安装OCLint

来自分类Dev

如何在Mac OS X中设置默认的蚂蚁路径?

来自分类Dev

如何在Mac OS X中静默安装pkg文件

来自分类Dev

如何在Mac OS X 10.10中设置GOPATH

来自分类Dev

如何在Mac OS X 10.9中编写llvm pass

来自分类Dev

如何在Mac OS X的子进程中打开文件

来自分类Dev

如何在Mac OS X中隐藏终端窗口?

来自分类Dev

如何在Mac OS X中查询最近的商品?

来自分类Dev

如何在Mac OS X中安装Htop?

来自分类Dev

如何在Mac OS X中向上滚动?

来自分类Dev

如何在Mac OS X的VLC中获得FluidSynth支持?

来自分类Dev

如何在Mac OS X 10.9中编写llvm pass

来自分类Dev

如何在Mac OS X中查询最近的商品?

来自分类Dev

如何在Mac OS X中更正发生故障的终端?

来自分类Dev

如何在Mac OS X中修复System Python的权限?

来自分类Dev

如何在Mac OS X中设置phpimagik?

Related 相关文章

热门标签

归档