据我所知,函数brk()和sbrk()用于重新分配内存。但它们与realloc()函数有何不同?请给出编码示例。
brk
和sbrk
是系统调用(在内核中实现),而malloc
、free
、realloc
是用户空间库函数。因此,malloc
等函数在内部使用brk
和sbrk
,但提供了额外的功能(有关brk
的更多详细信息,请参见man(2),有关malloc
的更多详细信息,请参见man(3))。
brk
仅告诉内核程序想要使用多少内存,通过给内核一个指向程序可能使用的最大虚拟内存位置的指针。但你只有一个大块内存。
malloc
帮助你将这个巨大的内存块细分为较小的部分。
示例代码在这里没有太多意义,因为brk
和malloc
在不同的层面上工作。但你可以考虑如何实现一个非常简单(且不线程安全)的malloc
和free
版本,以及在哪里使用brk
:
brk
以增加我们从内核获得的可用内存正如@BasileStarynkevitch在他的评论中所指出的那样,作为brk
的替代方案,您还可以使用mmap
(使用fd=-1
和flags=MAP_PRIVATE|MAP_ANONYMOUS
)来保留由交换文件支持的单个内存块。有关mmap的详细信息,请参见man(2)。
brk
和sbrk
调整该区域的大小,但无法重新排列它,并且它始终是连续的。大多数进行动态内存分配的程序都需要更灵活的东西。
malloc
、free
和realloc
是C库函数,它们提供了更加灵活的功能。在底层,它们通过调用brk
和/或sbrk
从操作系统获取内存,但然后它们进行额外的处理,让您可以(a)分配任意数量的(b)不同大小的块,您可以(c)在完成后单独将它们返回到池中,顺便(d)调整大小。free
将内存返回到池中时,它通常只会回到未来由您的程序调用malloc
的池中;内存通常不会被返还给操作系统。
(s)brk
函数是遗留函数,并且已经从POSIX标准中删除。据我所知,它们也从未成为C标准的一部分。 - Elias Van Ootegemmalloc
的实现者,否则调用带有非零参数的sbrk
或根本不调用brk
都是不安全的。在malloc
背后移动内存断点将破坏内部数据结构,并导致程序在下一次使用malloc
、realloc
或free
时崩溃——几乎所有的C库函数都允许在内部使用malloc
! - zwol