当前位置: 代码迷 >> C语言 >> 大家帮我解释一下c的释放内存的原理
  详细解决方案

大家帮我解释一下c的释放内存的原理

热度:315   发布时间:2008-04-19 00:18:00.0
大家帮我解释一下c的释放内存的原理
有下面的一段代码
void my_free(void *ptr)
{
  if(ptr>=btm_of_heap)
   {
     if(ptr<top_of_heap)
       (
         ptr->link=heap;
         heap=ptr;
         return;
        }
      else
      if(free(ptr))
       { return;}
    }
puts("\nAttemp to free unallocated block!\n\7");
exit(1);
}
该函数通过传入的要释放的内存区域的首地址来判断这快内存是不是从heap分配
出去的.如果是,则btm_of_heap<=ptr<top_of_heap应放把它放到链表表头,其操作是
ptr->link=heap;否则,说明这个内存是由malloc分配的,执行else中的free().
问题:两个红色的部分不懂
放到表头就能释放了吗
所有的堆,不都是malloc分配的吗
难道有两个链表控制内存的分配.回收管理问题吗
不怎么理解
望解释
搜索更多相关的解决方案: 内存  原理  释放  解释  

----------------解决方案--------------------------------------------------------
代码后面的那段描述好像并没有说要释放,只说如果是栈空间就把指针放在链表的表头,
倒是说了如果该区域是malloc出来的,就释放并退出
没有上下文,无法进一步判断
----------------解决方案--------------------------------------------------------
上面还有个函数,该函数用来初始化分配内存.在这个函数中,分配了50个大小是80B的
内存块,用一个一维表来维护.heap存放的是堆的头指针,它随着快的分配和回收不断变化,通过top_of_heap和btm_of_heap静态变量,可以知道哪部分内存应该由内存分配程序来维护.当一快内存要释放的时候,如果他的地址在top_of_heap和btm_of_heap之间,就说明这快内存是由这个链表维护的

我看了半天也不知道,内存快放表头,就可以释放内存?
----------------解决方案--------------------------------------------------------
各位 帮帮忙啊
----------------解决方案--------------------------------------------------------
c的内存释放原理
我是这样认为的:
局部变量(除了静态变量)在被调函数调用结束后占用的内存空间都会被自动释放,因为他们是位于堆栈中的,如果不相信的话,写一段简单的c程序然后反汇编看看汇编代码就可以知道了。
全局变量,静态变量,还有用malloc的指针等开辟在堆中,这些东西除非程序执行完结束,否则是不会被自动释放的。
还有被赋初值的局部变量,数组等,这个我没有考虑过,不过觉得也是在堆中,但是在堆栈中有一个空间存放他们在堆中的地址。
有时候光看书不能明白的,所以最好自己动手写代码然后把他们反汇编,看伪汇编代码容易明白。
----------------解决方案--------------------------------------------------------
楼上说的不怎么懂啊
能不能给段代码给我啊 汇编我也学过一点点
----------------解决方案--------------------------------------------------------
楼主刚学连表?支持下
----------------解决方案--------------------------------------------------------
malloc的实现在154页....应该可以解释你的问题

[[it] 本帖最后由 hao0716 于 2008-4-21 15:54 编辑 [/it]]
----------------解决方案--------------------------------------------------------
回复 7# 的帖子
早学过了 在看操作系统 想知道释放内存的原理
----------------解决方案--------------------------------------------------------