malloc打印mallinfo信息定位内存增长的问题

来源:互联网 发布:安阳知满天教育官网 编辑:程序博客网 时间:2024/05/08 07:27

背景

malloc 的基本原理,之前的几篇文章已经介绍过了。这里主要想说明一下根据mallinfo的信息来分析内存实际的问题。

malloc后立即free

void test2(){    print_info();     cout << hex << sbrk(0) << endl;    for ( int i = 0; i < 1; ++i )    {           free(malloc(1024));    }       cout << "------------------------------------------" << endl;    cout << hex << sbrk(0) << endl;    print_info(); }

结果如下图


我们可以知道edata指针被推高了0x21000即135168个字节。

无论是malloc几次,只要未超过edata,都不会再将edata推高。

但是结束的时候,我们可以知道,mallinfo 中的 system bytes为实际堆sbrk - start_brk 的值。

malloc多次后再统一free


void test3(){        char** ptr_arr[ARRAY_SIZE];         int i;          for( i = 0; i < ARRAY_SIZE; i++)         {                   ptr_arr[i] = (char **)malloc(1024);         }           print_info();         for( i = 0; i < ARRAY_SIZE; i++)         {                   free(ptr_arr[i]);         }           printf("\n-------------------------------------------------\n");         print_info(); }

结果如下图


实际从edata被推高2次,但是结束时又回落了到第一次的地址。

free的时候会合并空闲块,并回退edata(无数据时)。

0 0
原创粉丝点击