当前位置: 首页 > 面试题库 >

C中的问题用法存储器

牧献
2023-03-14
问题内容

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

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



 类似资料:
  • 我在使用spring存储库和服务的代码中遇到了这个问题,在我的spring项目中,它不适用于用户和角色,这是他们的服务和存储库的问题: 这是用户实现存储库: 这是用户的存储库和服务: 用户服务 试图消除空白,但这是同样的问题,我搜索了很多关于它,但没有找到任何解决方案。

  • 我有一个存储在中,我也有一个方法来验证令牌是否正确,正如您在这段代码中看到的: 如果令牌我将返回null,否则继续验证。 有两个问题我不能理解: 为什么我刷新页面时丢失了本地存储的令牌 为什么返回false当是时,第一个console.log返回未定义的,但我的方法继续。

  • 本文向大家介绍C#中调用MySQL存储过程的方法,包括了C#中调用MySQL存储过程的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中调用MySQL存储过程的方法。分享给大家供大家参考。具体如下: 这段代码演示在 C# 程序中调用 MySQL 的存储过程,没有返回值,没有参数传递。 希望本文所述对大家的C#程序设计有所帮助。

  • 本文向大家介绍web.py在SAE中的Session问题解决方法(使用mysql存储),包括了web.py在SAE中的Session问题解决方法(使用mysql存储)的使用技巧和注意事项,需要的朋友参考一下 这段时间一直想尝试着在SAE中使用Python,初步选择了Web.py框架做为开发框架,但是可怜SAE上的资料少的可怜,有点问题基本上解决不了,今天解决一个Session在Session的存储

  • 我正在遵循一个足够简单的YouTube教程(链接在这里),关于使用MVC的存储库设计模式。它很好,但他使用 MVC5 和 EF6,它们对异步方法有很多支持。 我正在使用MVC4,每当我尝试将项目升级为使用EF6时都会遇到重大问题。所以我只使用EF5,但这不是问题。 我将他教程中的代码修改为不使用Async,如下所示(他的原始代码在注释中): 下面是完成一些基本实现后,接口生成的代码(存储库): 同

  • 我在我创建的谷歌云存储上有一个存储桶。我想测试一些内置ACL,如public read、public read write等。但是,一旦我使用gsutil setacl命令更改了ACL,例如: