malloc_trim的手册页说它释放了空闲内存,所以如果堆中有分配的内存,它将不会释放整个堆.如果你知道你仍然需要一定数量的内存,那么参数就在那里,因此释放更多内容会导致glibc以后不得不做不必要的工作.至于漏洞,这是内存管理和向OS返回内存的标准问题.程序可用的主要低级堆管理是brk和sbrk,他们所能做的就是通过更改顶部来扩展或缩小堆区域.因此他们无法向操作系统返回漏洞;一旦程序调用sbrk来分配更多堆,只有当该空间的顶部空闲且可以返回时才能返回该空间.
请注意,还有其他更复杂的方式来分配内存(例如,使用匿名mmap),这些方法可能具有与基于sbrk的分配不同的约束.
sbrk(0)返回堆 增长的头部位置,malloc返回未分配(glibc)的地址 开始(第一次分配如下图所示)
通过 brk,sbrk, malloc 深刻理解,内存动态管理