1、增量方式分配虚拟内存(堆内存),一次分配一个页。分配内存超出页的范围则增加新页,超出页的操作会发生段错误。在分配的内存里面使用是安全的,除此之外在1024字节内的写是不稳定的。
#include <unistd.h>
void *sbrk(
intptr_t increment; //内存增量(以字节为单位)
);
返回上一次调用brk/sbrk后的末位地址,失败返回-1.
increment 取值:
0 - 获取末尾地址。
>0 - 增加内存空间
<0 - 释放内存空间,也是返回上一次调用的末尾地址,全释放就解除映射,访问任何
地址都会报段错误,这里跟malloc有区别,malloc保留33个页。
内部维护一个指针,
指向当前堆内存最后一个字节的下一个位置。
sbrk函数根据增量参数调整该指针的位置,
同时返回改指针原来的位置。
若发现页耗尽或者空闲,则自动追加或取消页映射。
![](https://img.haomeiwen.com/i15735115/18d2914931897272.jpg)
![](https://img.haomeiwen.com/i15735115/982ff4460c9f8b8a.jpg)
2、修改虚拟内存块末尾地址
include <unistd.h>
int brk(void* end_data_segment);//内存块末尾地址,sbrk返回的指针在加具体字节数。
成功返回0,失败返回-1
内部维护一个指针,
指向当前堆内存最后一个字节的下一个位置。
brk函数根据指针参数设置该指针的位置。
若发现页耗尽或者空闲,则自动追加或取消页映射。
void* p = sbrk(0); brk(p2=p+4); //因为成功返回0
![](https://img.haomeiwen.com/i15735115/3fa4bae622093751.jpg)
一般使用sbrk分配内存,释放内存使用brk。。
这样可以做到多次分配,一次释放。
![](https://img.haomeiwen.com/i15735115/611b3cc1ba282845.jpg)
网友评论