一尘不染

C中的问题用法存储器

linux

请帮助:)操作系统:Linux

在“ sleep(1000);”中,此时“ top(显示Linux任务)”写给我7.7%MEM使用。valgrind:找不到内存泄漏。

我了解,正确编写,所有malloc结果均为NULL。但是,为什么在这段时间“睡眠”我的程序不会减少内存?缺少什么?

对不起,我的英语不好,谢谢

~ # tmp_soft
For : Is it free??  no
Is it free??  yes
For 0 
For : Is it free??  no
Is it free??  yes
For 1 
END : Is it free??  yes
END



〜#顶部
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                
23060 root      20   0  155m 153m  448 S    0  7.7   0:01.07 tmp_soft

全文:tmp_soft.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

struct cache_db_s
{
 int       table_update;
 struct    cache_db_s * p_next;
};

void free_cache_db (struct cache_db_s ** cache_db)
{
 struct cache_db_s * cache_db_t;
 while (*cache_db != NULL)
 {
  cache_db_t = *cache_db;
  *cache_db = (*cache_db)->p_next;
  free(cache_db_t);
  cache_db_t = NULL;
 }
 printf("Is it free??  %s\n",*cache_db==NULL?"yes":"no");
}

void make_cache_db (struct cache_db_s ** cache_db)
{
 struct cache_db_s * cache_db_t = NULL;
 int n = 10000000;

 for (int i=0; i = n; i++)
 {
  if ((cache_db_t=malloc(sizeof(struct cache_db_s)))==NULL) {
   printf("Error : malloc 1 -> cache_db_s (no free memory) \n");
   break;
  }
  memset(cache_db_t, 0, sizeof(struct cache_db_s));

  cache_db_t->table_update = 1; // tmp

  cache_db_t->p_next = *cache_db;
  *cache_db = cache_db_t;
  cache_db_t = NULL;
 }
}

int main(int argc, char **argv)
{
 struct cache_db_s * cache_db = NULL;

 for (int ii=0; ii  2; ii++) {
  make_cache_db(&cache_db);
  printf("For : Is it free??  %s\n",cache_db==NULL?"yes":"no");
  free_cache_db(&cache_db);
  printf("For %d \n", ii);
 }

 printf("END : Is it free??  %s\n",cache_db==NULL?"yes":"no");
 printf("END \n");
 sleep(1000);
 return 0;
}

阅读 179

收藏
2020-06-02

共1个答案

一尘不染

如果您要确定程序是否存在内存泄漏,则top不是适合该工作的工具(valrindis)。

top显示操作系统看到的内存使用情况。即使您调用free,也无法保证释放的内存将返回给操作系统。通常情况下不会。但是,在您的进程可以将其用于后续分配的意义上,内存确实变得“空闲”。

编辑
如果libc支持,可以尝试进行尝试M_TRIM_THRESHOLD。即使您遵循此路径,也将非常棘手(靠近堆顶部的单个使用过的块将阻止将其下的所有可用内存释放给操作系统)。

2020-06-02