C++ 为什么malloc_trim()只适用于主竞技场?

C++ 为什么malloc_trim()只适用于主竞技场?,c++,c,glibc,C++,C,Glibc,glibc的malloc实现支持“malloc_trim()”调用,该调用允许应用程序将未使用的(即释放的内存块)释放回系统(实现细节:通过使用负参数调用sbrk()减少程序的数据段)。但是,此功能仅适用于主竞技场。在多线程程序中,有多个arena保存释放的块。为什么此调用不同时释放其他竞技场的内存?除主竞技场之外的其他竞技场可能是使用mmap从系统分配的,因此sbrk不能用于将内存返回系统。可以让glibc使用mremap缩小这些其他领域。还要注意, MalLoop-Trim只能在竞技场结束时

glibc的malloc实现支持“malloc_trim()”调用,该调用允许应用程序将未使用的(即释放的内存块)释放回系统(实现细节:通过使用负参数调用sbrk()减少程序的数据段)。但是,此功能仅适用于主竞技场。在多线程程序中,有多个arena保存释放的块。为什么此调用不同时释放其他竞技场的内存?

除主竞技场之外的其他竞技场可能是使用
mmap
从系统分配的,因此
sbrk
不能用于将内存返回系统。可以让glibc使用
mremap
缩小这些其他领域。还要注意,<代码> MalLoop-Trim只能在竞技场结束时返回内存,如果在竞技场的中间有空块,则无法释放该内存。

可能是因为从与它分配的不同的场所释放内存不是一个好主意…它也只能从堆的顶部释放内存。杰夫,谢谢你的回复。我正在glibc代码中对此进行研究,并将用我发现的答案更新此问题。杰夫,谢谢,你的答案是正确的sbrk'只能用于缩小程序的数据段,因此malloc_trim仅适用于位于那里的主竞技场。