请帮助:)操作系统: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; }
如果您要确定程序是否存在内存泄漏,则top不是适合该工作的工具(valrindis)。
top
valrind
top显示操作系统看到的内存使用情况。即使您调用free,也无法保证释放的内存将返回给操作系统。通常情况下不会。但是,在您的进程可以将其用于后续分配的意义上,内存确实变得“空闲”。
free
编辑 如果libc支持,可以尝试进行尝试M_TRIM_THRESHOLD。即使您遵循此路径,也将非常棘手(靠近堆顶部的单个使用过的块将阻止将其下的所有可用内存释放给操作系统)。
libc
M_TRIM_THRESHOLD