假设我有一块大的映射内存正在使用中,它来自于 mmap 匿名内存或使用 MAP_PRIVATE。下次当我需要足够大的内存分配时,我可以使用 munmap 将其释放,然后再使用 malloc 和 mmap 重新分配。 但是,我可以直接将该内存交给 malloc 吗?我可以说 "嘿,malloc,这里有一个映射地址范围,请用它作为堆空间。你可以随意使用 mprotect ,mremap 或甚至 munmap 它。" 我在 Linux 上使用 glibc。
glibc malloc调用__morecore(函数指针)以获取更多内存。请参见。然而,这通常不起作用,因为实现假设该函数的行为类似于sbrk,并从单个较大的内存区域返回内存。在实践中,对于glibc malloc,使内存可供malloc重复使用的唯一现实方法是调用munmap。其他malloc实现允许捐赠内存(在某些情况下作为内部接口)。例如,musl的malloc有一个名为__malloc_donate的函数,应该可以满足您的要求。
malloc_get_state
、malloc_get_state
和mallopt
,但似乎都不能满足我的需求。 - Filipp