有时使用堆分配函数的代码会引发以下错误:munmap_chunk(): invalid pointer
在上下文中munmap_chunk()
出现是一个函数,而这些错误就是该函数引发它们。此功能是什么?该功能做什么?
我的问题很简单,因此没有理由提供很多额外的信息:munmap_chunk()
是什么?
答案 0 :(得分:3)
两个简单的函数malloc
和free
必须解决矛盾的问题:
要同时解决这两个问题,分配器(至少是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合并问题。