代码改变世界

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调用析构函数。

 

---恢复内容结束---