提问人:Praveen 提问时间:2/22/2023 最后编辑:chqrliePraveen 更新时间:2/23/2023 访问量:229
在什么情况下malloc_trim(0)会导致崩溃?
In what circumstances can malloc_trim(0) cause a crash?
问:
我有一段代码,我用它来将任何未使用的内存释放回系统。
但是我断断续续地看到它会导致崩溃。回溯如下:malloc_trim(0)
Program terminated with signal SIGSEGV, Segmentation fault.
#0 mtrim (pad=0, av=0xffff8eebf9f8 <main_arena>) at malloc.c:4771
4771 INTERNAL_SIZE_T size = chunksize (p);
#0 mtrim (pad=0, av=0xffff8eebf9f8 <main_arena>) at malloc.c:4771
#1 __malloc_trim (s=s@entry=0) at malloc.c:4822
我想知道这次崩溃的原因以及如何避免它。
我检查了手册页,它看起来不会导致崩溃。malloc_trim()
答:
以下是 的手册页:malloc_trim()
MALLOC_TRIM(3) Linux 程序员手册 MALLOC_TRIM(3)
名字
malloc_trim
- 从堆顶部释放可用内存概要
#include <malloc.h> int malloc_trim(size_t pad);
描述
该函数尝试释放堆顶部的可用内存(通过使用合适的参数进行调用)。
malloc_trim()
sbrk(2)
该参数指定在堆顶部保留未修剪的可用空间量。如果此参数为 ,则在堆的顶部仅保留最小的内存量(即一页或更少)。非零参数可用于在堆顶部保留一些尾随空间,以便将来进行分配,而不必使用 扩展堆。
pad
0
sbrk(2)
返回值
如果内存实际释放回系统,或者无法释放任何内存,则返回该函数。
malloc_trim()
1
0
错误
未定义任何错误。
符合
这个函数是一个GNU扩展。
笔记
在某些情况下,会自动调用此函数;请参阅 和 中的讨论。
free(3)
M_TOP_PAD
M_TRIM_THRESHOLD
mallopt(3)
此函数无法释放位于堆顶部以外的位置的可用内存。
此功能仅释放主竞技场中的内存。
0
是这个 GNU 扩展函数的一个非常好的论据。报告的错误似乎表明堆已损坏,可能是由程序在调用 之前引起的。这些错误可能是:malloc_trim()
- 修改已分配块末尾或开头之前的字节
- 在块被释放后对其进行修改
- 同一块的多个自由
您应该使用 valgrind 等内存工具进行调查,以确定这些问题。
另请注意,它不是可移植的,并且在实践中兴趣有限,因为它只修剪了分配了 .现代分配器用于分配不同的竞技场,并应自动处理将未使用的页面释放回操作系统。malloc_trim()
sbrk()
mmap
评论
malloc_trim()