在什么情况下malloc_trim(0)会导致崩溃?

In what circumstances can malloc_trim(0) cause a crash?

提问人:Praveen 提问时间:2/22/2023 最后编辑:chqrliePraveen 更新时间:2/23/2023 访问量:229

问:

我有一段代码,我用它来将任何未使用的内存释放回系统。 但是我断断续续地看到它会导致崩溃。回溯如下: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()

C 内存管理 malloc free brk

评论

0赞 Emanuel P 2/22/2023
没有代码,这是不可能分辨的。
0赞 Support Ukraine 2/22/2023
法典?法典?法典?
0赞 Allan Wind 2/22/2023
为什么要使用 ?malloc_trim()

答:

2赞 chqrlie 2/22/2023 #1

以下是 的手册页:malloc_trim()

MALLOC_TRIM(3) Linux 程序员手册 MALLOC_TRIM(3)

名字

malloc_trim- 从堆顶部释放可用内存

概要

#include <malloc.h>

int malloc_trim(size_t pad);

描述

该函数尝试释放堆顶部的可用内存(通过使用合适的参数进行调用)。malloc_trim()sbrk(2)

该参数指定在堆顶部保留未修剪的可用空间量。如果此参数为 ,则在堆的顶部仅保留最小的内存量(即一页或更少)。非零参数可用于在堆顶部保留一些尾随空间,以便将来进行分配,而不必使用 扩展堆。pad0sbrk(2)

返回值

如果内存实际释放回系统,或者无法释放任何内存,则返回该函数。malloc_trim()10

错误

未定义任何错误。

符合

这个函数是一个GNU扩展。

笔记

在某些情况下,会自动调用此函数;请参阅 和 中的讨论。free(3)M_TOP_PADM_TRIM_THRESHOLDmallopt(3)

此函数无法释放位于堆顶部以外的位置的可用内存。

此功能仅释放主竞技场中的内存。

0是这个 GNU 扩展函数的一个非常好的论据。报告的错误似乎表明堆已损坏,可能是由程序在调用 之前引起的。这些错误可能是:malloc_trim()

  • 修改已分配块末尾或开头之前的字节
  • 在块被释放后对其进行修改
  • 同一块的多个自由

您应该使用 valgrind 等内存工具进行调查,以确定这些问题。

另请注意,它不是可移植的,并且在实践中兴趣有限,因为它只修剪了分配了 .现代分配器用于分配不同的竞技场,并应自动处理将未使用的页面释放回操作系统。malloc_trim()sbrk()mmap