munmap_chunk() 是函数吗?如果是这样,它有什么作用?

Is munmap_chunk() a function? If so, what does it do?

有时使用堆分配函数的代码会抛出这个错误:munmap_chunk(): invalid pointer 上下文显示 munmap_chunk() 是一个函数,这些错误是这个函数抛出的。这个函数是什么,这个函数有什么作用?

我的问题很简单,所以没有理由提供很多额外的信息:什么是munmap_chunk()

两个简单的函数mallocfree必须解决矛盾的问题:

  • 必须尽快将内存 return 写入内核。
  • 内存分配必须很快,因此内存不能立即 returned 到内核,应该重新使用。加上内存碎片,这使得无法 return 内存到内核(glibc 根本不这样做)。

为了解决这两个问题,分配器(至少是 glibc、musl、windows)有一个分配对象大小的阈值:大于该大小的分配是通过直接调用 mmap 来完成的/VirtualAlloc 释放这些块时直接进入 munmap/VirtualFree.

这使得 malloc 对于小分配保持快速,同时对于大分配保持内存高效(因为它可以立即释放大块内存)。

阈值通常约为 128 KB 或更大(请参阅 musl 中的 DEFAULT_MMAP_THRESHOLD_MIN in glibc, MMAP_THRESHOLD)。

glibc 中的函数 munmap_chunk 负责此操作,通常这样调用:

if (chunk_is_mmapped(p)) {
    munmap_chunk(p);
    return;
}

当将指针传递给看起来像 mmap 分配的块的内存块时,您会看到 munmap_chunk(): invalid pointer 消息,但经调查发现大小无效,这意味着存在内存损坏或free 误用。

除此之外,它还负责跟踪通过 mmap 分配的块数,以解决 Linux 内核 issues.[=28= 上的 VMA 合并问题]