malloc()和free()解释
2013-02-20 16:40 littlelion 阅读(1146) 评论(0) 编辑 收藏 举报---恢复内容开始---
malloc和free是在面试中常遇到的问题,其实只要是基础知识肯定会常遇到吧。
malloc()
用于在动态存储空间分配一块连续的空间,free()用于释放这片空间,还给操作系统,这两个操作都工程狮来完成。用法如下:
int p; p=(int*)malloc(sizeof(int)*4); //...// free(p); p=NULL;
- 当内存分配成功时,会返回一个指向这块空间的指针p,p指向了这个区域的首地址。
- 因为malloc返回的是void类型,因此在返回之前要进行强制类型转换,如 int*、 char*
- 如果内存分配失败了,会返回一个空指针NULL,当空间不足时会出现这种情
free()
当不再需要这片区域时,要记得还给操作系统,至于说令p=NULL,是为了防止以后使用p
tips:
- 这两个函数一定是成对出现的,如果malloc了空间,却不记得free,会造成内存泄露。
- malloc从堆里面获得空间,操作系统有一个记录空闲空间的链表,当收到请求时,会遍历该链表,找到一个>=申请空间的区域给程序员,并从链表中删除该节点。
- 再对堆和栈进行说明:堆是大家共有的,分为全局堆和局部堆。全局堆是尚未被分配的空间,局部堆就是已经分配了的空间。栈:每个函数都有自己的栈,并且线程之间的栈是相互独立的,下面看一个例子:
void function(){
int* p;
p=(int*)malloc(sizeof(char)*100);
}
当函数返回时,函数所在的栈被销毁,那是不是说明p也被销毁了呢?并不是这样的,我们知道,p所指向的是存在于堆上的一片区域,当函数返回时,并不代表这片区域也被释放了,除非free(p)。所以free的本质并不是释放了p,而是p所指向的区域。
- new/delete 和 malloc/free的区别
malloc free是函数,new delete是运算符;调用malloc() free()时,只是完成分配空间、释放空间,而使用new时,会同时调用构造函数,完成对象初始化的工作,同理delete调用析构函数。
---恢复内容结束---