malloc_stats---检查内存泄露的神器

来源:互联网 发布:mac五笔型只有字根 编辑:程序博客网 时间:2024/06/05 08:46

在之前的博客中提到过,valgrind可以用来检测内存泄露,但在使用中,往往会遇到一些问题,给调试工作带来很多不必要的麻烦,我自己遇到的有以下两种:

      (1)内存泄露误检(系统初始化时,可能有一些需要长期保存在内存中的数据结构,这些空间是永远不释放的,而这些内存会被认为绝对泄露)

      (2) valgrind检查内存泄露过于全面,运行后的结果太多往往很难从中找到有用的信息。有时候,我们只需要关注某些函数,可能在执行某个操作,调用某些函数时会出现内存泄露,此时,valgrind的工作显得冗余而复杂

系统库函数中提供了malloc_stats()函数,可以统计本进程具体的内存使用情况,精确到字节,malloc_stats()函数声明如下:

#include<stdlib.h>

void malloc_stats(void);

malloc_stats()执行结果如下:

Arena 0://第一个arena(每个线程分配一个arena),这里只有一个线程
system bytes     =     135168//本线程从操作系统获得的动态内存,这里是132KB
in use bytes     =       1152//本线程在使用的动态内存,1152字节
Total (incl. mmap)://总的使用情况,各个线程使用动态内存的累加值
system bytes     =     135168//本进程从操作系统获得的动态内存,这里是132KB
in use bytes     =       1152//本进程在使用的动态内存,1152字节
max mmap regions =          0//当一次申请内存超过128KB(32位操作系统)或1MB(64位操作系统)时,会增加mmap区域,这里统计使用mmap区域的个数
max mmap bytes   =          0//mmap区域对应内存大小

不说废话,来段代码看看效果

[cpp] view plain copy
  1. //test_malloc_stats.c  
  2. #include<stdio.h>  
  3. #include<stdlib.h>  
  4.   
  5. int func1();  
  6.   
  7. int main()  
  8. {  
  9.     char *p=NULL;  
  10.     p=(char *)malloc(100);  
  11.     if(!p){  
  12.         printf("In main ,malloc fail\n");  
  13.         return -1;  
  14.     }  
  15.     printf("********before call func1 **********\n");  
  16.     malloc_stats();//在要执行内存检测的函数之前打印内存信息  
  17.       
  18.     func1();  
  19.     printf("\n@@@@@@@@after call func1 @@@@@@@@@@@\n");  
  20.     malloc_stats();//在要执行内存检测的函数之后打印内存信息  
  21.     free(p);  
  22.     return 1;  
  23.       
  24. }  
  25.   
  26. int func1(void)//申请1024字节,但没有释放,有内存泄露  
  27. {  
  28.     char *p=NULL;  
  29.     p=(char *)malloc(1024);//func1函数申请1024字节  
  30.     if(!p)  
  31.     {  
  32.         printf("Malloc error\n");  
  33.     }  
  34.     return 0;  
  35. }  
如上代码,编译(gcc test_malloc_stats.c ),运行(./a.out),结果如下


如上图,在调用func1之前,内存使用位112B,调用之后,内存使用1152B,增加了1040字节,说明函数func1存在内存泄露,此时检查func1函数代码即可。如果func1确实会造成1040B的内存使用,这就说明func1没有问题。


这里,您可能会发现申请了1024字节,实际内存占用1040字节,这正是glib库的实现,另外的16字节用来管理分配的数据块

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕八个月了胎位不正怎么办 怀孕八个月胎位不正怎么办 欠债的人跑了怎么办 赌博输了100万怎么办 我赌博输了4万怎么办 办80张信用卡怎么办的 19岁负债十几万怎么办 欠了十几万该怎么办 网贷负债十几万怎么办 赌博欠了十几万怎么办 欠了网贷跑了会怎么办 欠银行钱还不起怎么办 欠小额贷款公司的钱还不上怎么办 负债30万没工作怎么办 华为p9耗电太快怎么办 酷派手机反应慢怎么办 网上买手机被骗了怎么办 买手机贵了怎么办12315 在手机店被骗了怎么办 在转转上被骗了怎么办 微信被骗了800怎么办 苹果6被偷走该怎么办 苹果7被偷走该怎么办 月经量突然少了怎么办 我月经老是不来怎么办 月经不来3个月怎么办 月经推迟3个月怎么办 乙肝五项25阳怎么办 乙肝五项25阳性怎么办 流浓鼻涕怎么办速效办法 鼻涕又浓又黄绿怎么办 玉露已经徒长了怎么办 多肉长出了多头怎么办 多肉已经徒长了怎么办 脖子抻筋了 很疼怎么办 声带肥大造成说话声音沙哑怎么办 轻微的骨性龅牙怎么办 19岁没了晨勃怎么办 早上晨勃消失了怎么办 阴茎勃而不坚怎么办 一个月婴儿痰多怎么办