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代表失败。
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);//相当于全部都释放了
}