关于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,进行操作
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。