Linux 系统编程手册第7章-内存分配

1.在堆上分配内存:
a.所谓堆,是一段长度可变的连续虚拟内存。开始于进程未初始化数据段末尾。通常将堆的当前边界称为program break。系统提供两个函数来调整program break,

#inclue<unistd.h>
int brk(void *end_data_segment); //return 0 success, -1 error brk函数调整program break为end_data_segment位置处。由于内存分配以页为单位,所以可能四舍五入到下一个页的边界处。
void *sbrk(intptr_t increment);//sbrk是在原基础上增加increment大小的空间。成功返回原来的program break的边界。所以sbrk(0)可以得到当前的program break。

b.在堆上分配内存就用malloc和free来处理。

#include<stdlib.h>
void *malloc(size_t size);
void free(void *ptr);

malloc分配内存的时候如果达到了program break的边界,系统会调整program break的边界。free函数也可能会改变program break的值,但是free的时候如果释放的空间不在program break的头上,则系统只是把该空间放入一个空闲列表,只有当program break的头上一部分空间别释放,才可能调整program break。
c.进程退出时,系统会释放该进程的所有资源,包括malloc申请的未被free的空间。所以内存泄漏当进程退出时会被清空。
d.malloc返回的内存,前面有几个字节是记录内存的长度的,以供free的时候知道该空间有多大。
e.malloc调试工具和库,mtrace()和muntrace()函数分别在程序中打开和关闭对内存分配调用进行跟踪的功能。需要与环境变量MALLOC_TRACE搭配使用,环境变量指定写入跟踪信息的文件名称。如果一切正常,会在文件里跟踪和记录所有对malloc函数包的调用,还提供一个脚本mtrace用于分析文件,生成易于理解的汇总报告。还有一些工具如valgrind和Insure++等。
f.还有一些变种函数用来分配内存,

#include<stdlib.h>
void *calloc(size_t numitems, size_t size);//用于给一组相同对象分配内存。numitems制定对象个数,size制定对象大小。返回这块内存的起始处指针,并都初始化为0.
void *realloc(void *ptr, size_t size);
//重新调整ptr空间的大小。返回新的起始地址。如果原来地址有内容,会复制到新的地址。也需要用free函数来释放。如果调用失败,则返回null,所以使用的时候,不要将返回值直接赋值给原地址,如果直接复制给原指针变量,万一调用失败,则会将原指针变量赋值为null,则原来的地址就成了野指针。
2.在栈上分配内存
alloca()可以动态分配内存,不过不是从堆上分配,而是从栈上分配。分配的内存在函数栈上,不需要free函数来释放。优点是分配速度快,自动释放。可以有一些特殊的用途。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值