【问题标题】:Why does the memory keep growing even though I called free()?为什么即使我调用了 free(),内存仍然在增长?
【发布时间】:2022-01-08 12:57:39
【问题描述】:

这是一个简单的演示,只是循环使用malloc()free()

#include <cstdio>
#include <cstdlib>
#include <cmath>
int main(int argc, char **argv) {
    int mallocTime = 100000;
    for (int i=1; i<=mallocTime; i++) {
        int size = (rand()%1024*1024*30);
        char *a = (char*)malloc(size);
        free(a);
    }
    int v; {
        // Pause program.
        scanf("%d", &v);
    }
    return 0;
}

我注意到,当mallocTime 变大时,我的记忆就会增长。
这是mallocTime = 0时的内存状态

root     21416  0.0  0.0   6568  1712 pts/4    S+   20:53   0:00 ./a.out

此时mallocTime = 100000

root     21786  0.0  0.5  37328 22204 pts/3    S+   20:55   0:00 ./a.out

如您所见,VSZ 和 RSS 都在增长。
我想知道为什么,很明显我正确地释放了内存,为什么它仍然增长?增加的内存字节数是多少?

【问题讨论】:

  • 操作系统是Debian10
  • free 一般会释放内存供进程内其他用途;它不一定将它从进程释放到操作系统。
  • 您的问题与内存泄漏和 linux 内核毫无共同之处。不要使用不相关的标签

标签: c linux memory malloc


【解决方案1】:

大多数 glibc malloc 实现不会将内存返回给操作系统,除非:

  1. 您在mallopt 中设置了阈值。但是根据我的经验,在向系统释放内存后,竞技场仍然由系统保留
  2. 调用malloc_trim 将向系统释放内存https://man7.org/linux/man-pages/man3/malloc_trim.3.html
  3. 通过系统调用madvicehttps://man7.org/linux/man-pages/man2/madvise.2.html

不要强制转换 malloc 的结果。如果您的编译器出现问题,则意味着您使用 C++ 编译器编译 C 代码,这不是一个好主意。

试试这个:

int main(void) {
    size_t mallocTime = 100000;

    srand((unsigned)time(NULL));
    while(mallocTime--)
    {
        int size = (rand()%1024*1024*30);
        char *a = malloc(size);
        free(a);
        malloc_trim(0);
    }
    int v; {
        // Pause program.
        scanf("%d", &v);
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 2019-09-21
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多