munmap_chunk() 是函数吗?如果是这样,它有什么作用?
Is munmap_chunk() a function? If so, what does it do?
有时使用堆分配函数的代码会抛出这个错误:munmap_chunk(): invalid pointer
上下文显示 munmap_chunk()
是一个函数,这些错误是这个函数抛出的。这个函数是什么,这个函数有什么作用?
我的问题很简单,所以没有理由提供很多额外的信息:什么是munmap_chunk()
?
两个简单的函数malloc
和free
必须解决矛盾的问题:
- 必须尽快将内存 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 合并问题]
有时使用堆分配函数的代码会抛出这个错误:munmap_chunk(): invalid pointer
上下文显示 munmap_chunk()
是一个函数,这些错误是这个函数抛出的。这个函数是什么,这个函数有什么作用?
我的问题很简单,所以没有理由提供很多额外的信息:什么是munmap_chunk()
?
两个简单的函数malloc
和free
必须解决矛盾的问题:
- 必须尽快将内存 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 合并问题]