linux 动态内存分配,关于linux下动态分配内存的问题

关于linux下动态分配内存的问题

(2010-07-11 18:20:47)

标签:

杂谈

在古老的C中,一进中年人C++中,通常我们需要自己动态分配内存。内存的使用是最容易出问题的地方,一不小心就会出现越界访问等问题。

从操作系统的角度来看,系统是现在都是用保护模式来控制内存的访问。系统把内存映射到虚拟内存上,把原本零散的物理内存,映射到虚拟内存上来,是用户请求系统分配的内存实际上系统的虚拟内存。

简单回顾以下c以及c++中内存分配的函数

malloc(size_t size)//用于申请内存 new和他的功能一样,但是new有默认的构造函数;

calloc (size_t nnumber,size_t size) //number

申请个数,size是申请类型的字节数,功能与malloc相似,但是申请之后会清零;

realloc(void*ptr,size-t size);

//ptr,内存地址,,size,内存大小,此函数也可以释放内存;

这是基本几个内存的申请和分配方式,还有系统底层两个函数;

brk( void*addr) and sbrk(void *addr)

mmap(void*addr,size_t long ,int proc, int flags,int fd,off_t

offset);

mmap函数比较负责,参数很多,前两个就不详细介绍,分别是指针的地址与内存的长度,proc是设置该内存是读写方式,PROC_READ|PROC_WRITE,主要是用到这两个,flags是用来设置内存的共享方式,与文件映射的关系:MAP_SHARED,设置内存为共享内存(这个在以后的进程间通信是很重要的选项)MAP_PRIVATE,MAP_ANOYNMOUS(MAP_ANON)括号内是简写,这个是设置是否映射内存与文件相关

fd提取映射文件的描述符,(fd=open(char*filename,int flags,int mode

))注意打开文件的读写方式要与内存的方式一致。如果不映射到文件上,fd=0,最后一个参数必须是系统内存页的整数倍,通常我们用0;

brk和sbrk比较有趣,很像游标卡尺,通过brk来调整内存的大小。

值得注意的是用sbrk每次分配内存返回的是内存的首地址,更进一步的说,其实malloc在做内存分配的时候,是一个很有趣的事情,比如申请一个4字节的空间,其实他分配的是16个字节的空气。其实是系统在做这个分配的时候,做了一些手脚,因为每次分配的时候他其实是新建一个结构,结构体内有4哥成员变量,分别表示当前申请的空间,前一个空件的指针,下一个空闲空间的指针,当前空间的指针,此构成16个字节的空间。

malloc,calloc,realloc的释放内存函数是free,c++中是delete,功能相同,但是

delete会调用析构函数

brk和sbrk都可以释放内存,但是要保存内存分配的首地址进行释放,eg。int

*p;int*p1=sbrk(4);如果直接操作p1,会使内存无法释放,造成泄漏,所以要用p=p1,进行操作

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值