动态内存分配
作者:互联网
堆是一段长度可变的连续虚拟内存。始于BBS段的末尾,随着内存的分配和释放而增减,堆的当前内存边界成为 program break
linux提供的系统调用:brk()和sbrk()。
#include<uinstd.h> //return 0 on success,or -1 on error int brk(void*end_data_segment); //return previous program break on success,or(void*)-1 on error void*sbrk(intptr_t increment);
brk将program break设置为参数end_data_segment所指定的位置,由于虚拟内存分配以页为单位,end_data_segment回到下一个内存页的边界处。
sbrk()在原地址上增加参数increment的大小。使用sbrk(0)可以获得program break当前位置。
增量为正数时,分配内存
增量为负数时,回收内存
program break的位置抬升以后,程序可以访问新分配区域内的任何内存地址,而此时物理内存页尚未分配,内核会在进程首次试图访问这些虚拟内存地址时自动分配新的物理内存页。
malloc函数
#include<stdlib.h> void*malloc(size_t size); void free(void*ptr);
malloc有以下有点
1.属于C语言的一部分
2.更易于在多线程程序中使用
3.接口简单,允许分配小块内存
4.允许随意释放内存块,他们被维护于一张空闲内存列表中,在后续内存分配调用时循环使用。
malloc返回的类型void*,可以赋值给任意类型的C指针。malloc返回内存块是基于8字节或者16字节边界来分配内存的。
一般情况下,free()并不会降低program break的位置,而是将这块内存添加到空闲内存列表中,供后续的malloc函数循环使用。
这么做的原因如下:
1.被释放的内存块通常位于堆的中间,而非堆的顶部,因此降低program break不可能。
2.减少了程序必须执行的sbrk的调用次数。
3.在大多数情况下,降低program break 的位置不会堆那些分配大量内存的程序有多少帮助,因为它们通常倾向于持有已分配内存或是反复释放和重新分配内存,而非释放所有内存后再持续运行一段时间。
标签:malloc,sbrk,void,break,program,内存,动态内存,分配 来源: https://www.cnblogs.com/sunmeng1994/p/11468155.html