【发布时间】:2021-01-09 11:08:10
【问题描述】:
我是C和堆内存的新手,以下是我对动态内存分配的理解,如果我错了,请纠正我:
事实1-当第一次调用malloc时,malloc会在内部调用sbrk来移动/增长brk指针(程序中断)。
事实 2-在调用 malloc 和 free 几次之后,两个分配的块之间可能有空闲块,所以如果我们再次调用 malloc 所需的大小小于空闲块的大小,那么这一次malloc 将不会在内部调用sbrk,而是malloc 只需修改一个现有空闲块的结构(设置分配位...等)并返回该块的地址。
【问题讨论】:
-
简单的回答:是的。更复杂的答案:您的
malloc实现可能根本不使用brk/sbrk,至少有时可能会使用mmap。 -
@StaceyGirl 感谢您的回答。但是
mmap不一定将对象映射到堆区,不是吗?我可以使用mmap将对象映射到任何合法区域。 -
mmap可用作sbrk的替代品,以从操作系统获取新内存。所谓的“堆区域”可以通过多种方式组织。 -
@StaceyGirl 是否在
mmap内部移动/增长 brk? -
@amjad 但
mmap不一定将对象映射到堆区域“堆区域”是您的实现定义的任何内容。它可以是来自brk()/sbrk()的内存,也可以是来自mmap()的内存,甚至可以是 POSIX 或 SysV 共享内存或实现可用于为您的进程提供内存的任何其他机制。
标签: c linux heap-memory dynamic-memory-allocation