munmap_chunk()是函数吗?如果是这样,它怎么办?

时间:2019-08-12 18:55:47

标签: c glibc

有时使用堆分配函数的代码会引发以下错误:munmap_chunk(): invalid pointer在上下文中munmap_chunk()出现是一个函数,而这些错误就是该函数引发它们。此功能是什么?该功能做什么?

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

1 个答案:

答案 0 :(得分:3)

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

  • 必须尽快将内存返回内核。
  • 内存分配必须快速,因此不能立即将内存返回给内核,而应重新使用。再加上内存碎片,这使得不可能将内存返回到内核(glibc根本不这样做)。

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

这使得可以在小型分配中保持malloc的速度,而大型分配则可以保持较高的内存效率(因为它可以立即释放大块内存)。

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

glibc中的函数munmap_chunk对此负责,通常这样称呼:

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

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

除此之外,它还负责跟踪通过free块分配的数量,以解决Linux内核issues上的VMA合并问题。