linux内存高级管理rbrk,brk函数

 malloc()和free()
   free()只能保证释放虚拟内存地址,但不保证解除物理内存的映射,而且,最后33个内存页的映射是无法free()的,进程结束才能解除最后33个内存页的映射。free()不一定释放物理内存,但一定释放虚拟内存。
  在应用中,malloc()和free()正常使用即可
 
  sbrk() 和 brk()
   sbrk() brk()是Unix/Linux系统函数,因此windows不识别。
   sbrk()和brk()底层维系了一个位置(position),通过位置的移动分配/回收内存
   void* sbrk(int increment)
   参数increment是位置移动的增量,如果正数,位置向后移动;如果负数,位置向前移动;如果为0,位置不移动,返回当前的位置。
   返回值,成功返回 移动之前的位置,失败返回 (void*)-1。
   释放内存、删除文件其实 都不清除数据,数据在放入新元素时被覆盖。
   brk()和sbrk()都是可以 分配也可以回收内存的函数。
   sbrk()分配内存时简单,回收内存时需要计算,比较麻烦,而brk()正好相反。
   int brk(void* pos)是直接指定位置。
    pos就是新位置,与原位置在哪里无关。
   返回值 0 代表成功,-1代表失败。

   brk()直接移动位置到新位置,而不管原来位置在哪里,类似 绝对路径。

sbrk()例子

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

int main(){
  void* p1 = sbrk(4);//p1指向初始位置,新位置在4字节
  void* p2 = sbrk(4);//映射一个内存页
  void* p3 = sbrk(4);// 正数代表分配内存
  void* p4 = sbrk(4);//位置在16
  *(int*)p4 = 100;
  printf("p1=%p,p2=%p,p3=%p,p4=%p\n",p1,p2,p3,p4);
  sbrk(-4);//负数代表 释放内存,返回值没有意义
  sbrk(-8);
  printf("%d\n",*(int*)p4);
  void* p = sbrk(0);//0取当前位置
  printf("p=%p\n",p);
  p = sbrk(4093);//4093+4 = 4097 超过一个字节,多一页
  printf("pid=%d\n",getpid());
  sleep(15);
  printf("释放1字节内存\n");
  sbrk(-1);  sleep(15);//少了一页
  sbrk(-4096); printf("全部释放\n");//解除映射
  while(1);
}



brk()例子

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

int main(){ 
  void* p = sbrk(0);//先取初始位置,以后才能brk
  int r = brk(p+4);//分配了4个字节
  if(r == -1){ perror("brk"); return -1; }
  brk(p+8);//重新分配了4个字节
  brk(p+4);//回收了4个字节
  int* pi = p;//从初始位置开始
  *pi = 100;
  //重新分配10个字节,放字符串 "abcde"
  char* s = sbrk(0);
  brk(s+10);//分配10字节
  //s = "abcde";//有问题,指向了只读区,堆区内存泄漏
  strcpy(s,"abcde");
  double* pd = sbrk(0);//取首地址
  brk(pd+1);//pd+1 移动了8个字节
  *pd = 1.0;
  printf("%d,%s,%lf\n",*pi,s,*pd);
  brk(pd);//释放double的空间
  brk(s);
  brk(pi);//全部释放
}


#include <stdio.h>
#include <unistd.h>
#include <string.h>
//brk和sbrk 结合使用
int main(){
  int* pi = sbrk(4);
  char* ps = sbrk(10);
  double* pd = sbrk(8);
  *pi = 100;
  strcpy(ps,"abcde");
  *pd = 1.0;
  printf("%d,%s,%lf\n",*pi,ps,*pd);
  
  brk(pi);//相当于全部都释放了
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值